2009-09-26 23 views
7

Tôi đang thử nghiệm với các dịch vụ web REST của WCF và tôi đang gặp sự cố với các thuộc tính Tự động triển khai.WCF Xml serialization và các thuộc tính được tự động thực hiện

Tôi có một lớp được gọi là DeviceDescriptor, được xác định như sau:

public class DeviceDescriptor 
{ 
    public string DeviceId { get; set; } 
    public string DisplayName { get; set; } 
} 

Tôi có một dịch vụ WCF RESTful đó là nghĩa vụ phải trả lại một Danh sách DeviceDescriptors - đây là hợp đồng dịch vụ của tôi:

[ServiceContract] 
public interface IChooser 
{ 
[WebGet(UriTemplate="/Chooser/RegisteredDevices")] 
[OperationContract] 
List<DeviceDescriptor> RegisteredDevices(); 

[WebGet(UriTemplate = "/Chooser/Ping")] 
[OperationContract] 
string Ping(); 
} 

Vâng, nó là loại công việc, ngoại trừ trong đầu ra XML, tên thuộc tính không xuất hiện đúng, có vẻ như bộ nối tiếp đang sử dụng "tên không thể hiển thị" của trường sao lưu được tạo tự động thay vì tên thuộc tính. Sản lượng của tôi xuất hiện như sau:

<DeviceDescriptor> 
    <_x003C_DeviceId_x003E_k__BackingField>Pipe.Dome</_x003C_DeviceId_x003E_k__BackingField> 
    <_x003C_DisplayName_x003E_k__BackingField>Pipe diagnostic tool</_x003C_DisplayName_x003E_k__BackingField> 
</DeviceDescriptor> 

Vì vậy, có cách nào không? Tại sao không WCF sử dụng tên thuộc tính?

+0

Các StackOverflow nghịch lý: Tôi vừa kiếm được 'câu hỏi phổ biến' huy hiệu cho mặt hàng này, nhưng chỉ có một phiếu bầu tán thành. –

Trả lời

4

Sử dụng phản chiếu để lấy chúng IIRC, nếu bạn muốn kiểm soát nhiều hơn, bạn nên cố gắng sử dụng DataContract, nó cho phép bạn chỉ định tên chính xác (sử dụng [DataMember(Name = "DeviceID")]). Xem thêm tài liệu trên DataMemberAttribute

+0

Điều đó đã làm được. Tôi đã phải đặt một thuộc tính [DataContract] trên lớp và sau đó thuộc tính [DataMember (Name = "xxx")] trên thuộc tính, shazamm. Mặc dù hơi có mùi.Tôi tự hỏi tại sao WCF lại tìm thấy các trường sao lưu tự động được cho là tự động thực hiện và sử dụng chúng thay vì các tên thuộc tính công cộng? Trình biên dịch C# phải làm một số thế hệ mã dodgy. –

+0

Như tôi đã nói, nó có thể sử dụng sự phản chiếu để có được vị trí mà giá trị thuộc tính được lưu trữ, không phải tên của chính thuộc tính; nhưng tôi không có chuyên gia về WCF, vì vậy bạn có thể hỏi một câu hỏi WCF thực sự phát hiện ra tên như thế nào;) – Anteru

+0

(bạn đã trả lời đầy đủ câu hỏi chính, nhưng để theo dõi các ý kiến ​​tôi chạm một thời gian ngắn ở những điểm dưới đây) –

9

Để thêm một số chi tiết cho câu hỏi bạn yêu cầu trong nhận xét ... trong những ngày cũ (3.0) tốt WCF/DataContractSerializer khá nghiêm ngặt. Nếu loại của bạn không được đánh dấu rõ ràng là [DataContract] (hoặc IXmlSerializable để dự phòng) thì loại đó sẽ không được tuần tự hóa. Nó sử dụng các thành viên được đánh dấu là [DataMember], sử dụng tên rõ ràng trên thuộc tính nếu được chỉ định hoặc tên thành viên khác. Cuộc sống là tốt.

Gần đây hơn, mã đã được thay đổi cho phép các loại "thông thường" được tuần tự hóa - nghĩa là: các loại không có hợp đồng dữ liệu. Nó thực hiện điều này bằng cách sử dụng cùng một cách tiếp cận như sử dụng BinaryFormatter - tức là nó hoạt động ở trường -level. Đây là IMO xấu:

  • lĩnh vực đang thực hiện, không phải là hợp đồng
  • nó là giòn nếu bạn thay đổi ... bất cứ điều gì!
  • nó không nắm giữ nhiều nước chống lại obfuscation
  • một cái gì đó ngây thơ như chuyển sang/từ một auto-Prop phá vỡ nó (auto-props đã tên trường thực sự kỳ lạ, đó là không thể được mô phỏng trong thường xuyên C#)

Tôi biết lý do tại sao điều này là hấp dẫn (để cho phép WCF vận chuyển các loại tùy ý), nhưng mỗi sinew trong cơ thể của tôi cho biết đây là một mất mát ròng. Nó là tốt hơn để làm cho mọi người sử dụng các công cụ thích hợp (dữ liệu-hợp đồng) hơn là để cho các lớp học bị hỏng của họ làm việc. Trong bản gốc 3.0, sẽ có một ngoại lệ được ném cho biết bạn cách khắc phục điều này một cách chính xác: đánh dấu nó là [DataContract] và cho biết số [DataMember] mà bạn muốn sắp xếp theo thứ tự.

Xem thêm: Obfuscation, serialization and automatically implemented properties

+0

Tôi phải đồng ý với bạn - không chỉ thay đổi này là xấu trong thực tế mà còn "cảm thấy" sai khi nó đi ngược lại triết lý chọn tham gia đã tồn tại quá lâu. –

Các vấn đề liên quan