2013-07-16 34 views
6

Hãy để tôi nói trước bằng cách nói rằng tôi khá mới đối với WCF, và có thể sử dụng thuật ngữ sai ở đây. dự án của tôi có hai thành phần:Ngăn chặn việc tuần tự hóa các thành viên null trong DataContractSerializer

  1. Một DLL chứa các lớp cho tập tin đính kèm, mở rộng, ReportType1, và ReportType2
  2. Một WCF ServiceContract với một OperationContract như mô tả dưới đây mà deserializes như tài liệu XML vào các đối tượng có liên quan, sau đó serializes nó một lần nữa như JSON hoặc XML trở lại cho khách hàng.

Tôi có một lược đồ XML trông giống như sau:

<?xml version="1.0" encoding="windows-1252"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xsd:element name="Attachment"> 
     <xsd:complexType> 
      <xsd:all> 
       <xsd:element name="Extension" type="Extension" minOccurs="0" /> 
      </xsd:all> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:complexType> 
     <xsd:sequence name="Extension"> 
      <xsd:any processContents="skip" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

Tiếp theo sơ đồ này, tôi có một tài liệu XML của các loại sau đây:

<Attachment> 
    <Extension> 
     <ReportType1> 
      <Name>Report Type 1 Example</Name> 
     </ReportType1> 
    </Extension> 
</Attachment> 

tôi đã có các lớp sau trong một DLL đã biên dịch:

public class Attachment 
{ 
    public Extension Extension { get; set; } 
} 

public class Extension 
{ 
    [XmlElement(ElementName = "ReportType1", IsNullable = false)] 
    public ReportType1 ReportType1 { get; set; } 

    [XmlElement(ElementName = "ReportType2", IsNullable = false)] 
    public ReportType2 ReportType2 { get; set; } 
} 

WCF của tôi ervice deserializes tài liệu XML vào các đối tượng trên, và sau đó trả về nó ở định dạng JSON qua OperationContract sau:

[OperationContract] 
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.WrappedRequest)] 
Attachment Search(); 

Output thực tế như JSON

{ 
    'Attachment': { 
     'Extension': { 
      'ReportType1': { ... }, 
      'ReportType2': null 
     } 
    } 
} 

Output thực tế như XML

<Attachment> 
    <Extension> 
     <ReportType1>...</ReportType1> 
     <ReportType2 i:nil="true"></ReportType2> 
    </Extension> 
</Attachment> 

Đầu ra mong muốn dưới dạng JSO N

{ 
    'Attachment': { 
     'Extension': { 
      'ReportType1': { ... } 
     } 
    } 
} 

mong muốn Output dưới dạng XML

<Attachment> 
    <Extension> 
     <ReportType1>...</ReportType1> 
    </Extension> 
</Attachment> 

Các lớp từ DLL không có thuộc tính DataContract, nhưng dường như serialize chỉ tốt khi được gửi trở lại từ OperationContract của tôi, như tôi nhận được kết quả trên.

Làm cách nào để tôi không được tuần tự hóa các phần tử thành JSON/XML nếu chúng là rỗng mà không có khả năng biến các lớp từ DLL thành lớp DataContract? Tôi có nên kế thừa các lớp từ DLL, và bằng cách nào đó ghi đè chúng thành DataContract? Nếu vậy, làm thế nào tôi có thể thiết lập các thuộc tính trên các thành viên hiện có của các lớp cơ sở sau đó?

Vui lòng cho tôi biết nếu cần thêm thông tin và tôi sẽ cố hết sức để cung cấp.

+0

có một cái nhìn tại [tùy chỉnh serialization-với-DataContractSerializer] (http: // stackoverflow.com/questions/3156312/custom-serialization-with-datacontractserializer) Kính trọng. –

+0

Tôi đã tìm thấy [câu hỏi SO này] (http://stackoverflow.com/questions/5685045/how-to-not-return-null-when-a-data-member-field-is-not-set-in-the -data-contract) thực hiện những gì tôi theo sau, nhưng nó sẽ yêu cầu tôi trang trí các lớp trong DLL - nằm ngoài phạm vi của tôi. Một phần của vấn đề ở đây là không thể sửa đổi các lớp trong DLL. – crush

Trả lời

-1

Bạn có thể tạo một hàm có mẫu là ShouldSerialize {PropertyName} cho biết XmlSerializer nếu nó nên tuần tự hóa thành viên hay không.

check this question

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