2009-04-01 22 views
13

Tôi đang sử dụng .NET 3.0 DataContractSerializer mới. Tôi có cả hai mục Nullable < > và Danh sách <> các đối tượng mà tôi sắp xếp theo thứ tự. Ví dụ:Tôi có thể cấu hình DataContractSerializer để không tạo các phần tử tùy chọn (tức là Nullable <> và List <>) trong XML đầu ra không?

[DataContract(Namespace = "")] 
class Test 
{ 
    public static void Go() 
    { 
     Test test = new Test(); 

     var dcs = new DataContractSerializer(typeof(Test)); 
     dcs.WriteObject(new StreamWriter("test.xml").BaseStream, test); 
    } 

    [DataMember] 
    public Nullable<int> NullableNumber = null; 

    [DataMember] 
    public int Number = 5; 

    [DataMember] 
    public List<int> Numbers = new List<int>(); 
} 

Khi .NET sắp xếp một danh sách trống hoặc rỗng, nó đặt thành phần tử nil (cho Nullable) và trống (cho danh sách) vào XML. Ví dụ trên tạo:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <NullableNumber i:nil="true"/> 
    <Number>5</Number> 
    <Numbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
</Test> 

Vì lý do tôi không có thời gian để mô tả Tôi muốn loại bỏ các yếu tố NullableNumber và số dư thừa, như vậy:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Number>5</Number> 
</Test> 

Thật vậy, deserializes tập tin trên với serializer tốt.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

24

Đánh lĩnh vực với

[DataMember(EmitDefaultValue=false)] 

Điều đó sẽ làm việc trong thời gian ít nhất là trường hợp kiểu giá trị nullable. Đối với trường hợp Danh sách, bạn có thể cần trì hoãn việc tạo danh sách cho đến khi cần, hoặc không có thành viên nếu nó trống trước khi tuần tự hóa.

1

Tôi thực sự cần điều tương tự, nhưng được áp dụng trên toàn cầu cho nhiều trường trong các lớp RIA được tạo. Tôi không chắc liệu XML này có thể chấp nhận được với DataConstract để deserializing hay không. Nhưng nó có thể đọc được, trong đó các mục đích của tôi ...

public override string ToString() 
    { 
     var doc = XDocument.Parse(this.ToXML()); 
     WalkElement(doc.Root); 
     return doc.ToString(SaveOptions.None); 
    } 
    void WalkElement(XElement e) 
    { 
     var n = e.GetNamespaceOfPrefix("i"); 
     if (n != null) 
     { 
      var a = e.Attribute(n + "nil"); 
      if (a != null && a.Value.ToLower() == "true") 
       e.Remove(); 
     } 
     foreach (XElement child in e.Elements().ToList()) 
      WalkElement(child); 
    } 
Các vấn đề liên quan