Tôi đang cố gắng sử dụng dịch vụ web RESTful bằng WCF. Tôi không có quyền kiểm soát định dạng của dịch vụ web, vì vậy tôi phải thực hiện một vài cách giải quyết ở đây và ở đó. Tuy nhiên, một vấn đề lớn mà tôi dường như không thể xoay xở là làm thế nào để làm cho WCF deserialize một enum như một chuỗi.wcf deserialize enum dưới dạng chuỗi
Đây là mã của tôi (tên đã thay đổi, rõ ràng):
[DataContract]
public enum Foo
{
[EnumMember(Value = "bar")]
Bar,
[EnumMember(Value = "baz")]
Baz
}
[DataContract]
public class UNameIt
{
[DataMember(Name = "id")]
public long Id { get; private set; }
[DataMember(Name = "name")]
public string Name { get; private set; }
[DataMember(Name = "foo")]
public Foo Foo { get; private set; }
}
Và đây là dữ liệu trả về mà không deserialization:
{
"id":123456,
"name":"John Doe",
"foo":"bar"
}
Cuối cùng, ném ngoại lệ:
Đã xảy ra lỗi khi deserializing đối tượng của loại Service.Foo. Không thể phân tích cú pháp giá trị 'thanh' thành loại 'Int64'.
Tôi không muốn chuyển sang sử dụng XmlSerializer, bởi vì, trong số nhiều thiếu sót khác, nó sẽ không cho phép tôi cài đặt riêng tư trên các thuộc tính.
Làm cách nào để tạo WCF (hoặc, tốt, DataContractSerializer) xử lý enum của tôi dưới dạng giá trị chuỗi?
EDIT: Làm điều này có vẻ là không thể, và hành vi là cách nó được thiết kế. Cảm ơn bạn Microsoft, vì không cho chúng tôi lựa chọn, phải nghỉ mát để hack. Làm theo cách mà somori gợi ý có vẻ là cách duy nhất để có được chuỗi enums với JSON và WCF.
Bạn đã thử xây dựng một đối tượng UNameIt trong mã và sử dụng DataContractSerializer để tuần tự hóa (và sau đó deserialize nó) để xem nếu có thể serialization không phù hợp với thông điệp bạn nhận được? – GaussZ
Vấn đề là, tôi không phải là người thực hiện tuần tự hóa. JSON này xuất phát từ một bên thứ ba. Tôi không thể kiểm soát bất cứ điều gì về nó, điều duy nhất tôi có quyền kiểm soát là deserialization, ngoại trừ tôi đoán không, bởi vì tôi không thể có được WCF deserialize một enum cách những kẻ thiết lập enums. Tôi muốn DataContractSerializer linh hoạt hơn. – Alex
Có, tôi hiểu rằng bạn không có quyền kiểm soát nó, nó có thể gợi ý vấn đề mặc dù nếu bạn có thể so sánh một đối tượng tự tuần tự với những gì bạn nhận được từ bên thứ ba để hiểu tại sao serializer không thích nó. – GaussZ