2012-07-04 35 views
39

Tôi có lớp sau đây:Serialize tài sản như Xml Thuộc tính trong tử

[Serializable] 
public class SomeModel 
{ 
    [XmlElement("SomeStringElementName")] 
    public string SomeString { get; set; } 

    [XmlElement("SomeInfoElementName")] 
    public int SomeInfo { get; set; } 
} 

nào (khi dân cư với một số dữ liệu thử nghiệm) và In nhiều sử dụng XmlSerializer.Serialize() kết quả trong XML sau:

<SomeModel> 
    <SomeStringElementName>testData</SomeStringElementName> 
    <SomeInfoElementName>5</SomeInfoElementName> 
</SomeModel> 

gì tôi cần phải có là:

<SomeModel> 
    <SomeStringElementName Value="testData" /> 
    <SomeInfoElementName Value="5" /> 
</SomeModel> 

có cách nào để xác định đây là thuộc tính wit hout viết mã serialization tùy chỉnh của riêng tôi?

Trả lời

65

Bạn sẽ cần lớp wrapper:

public class SomeIntInfo 
{ 
    [XmlAttribute] 
    public int Value { get; set; } 
} 

public class SomeStringInfo 
{ 
    [XmlAttribute] 
    public string Value { get; set; } 
} 

public class SomeModel 
{ 
    [XmlElement("SomeStringElementName")] 
    public SomeStringInfo SomeString { get; set; } 

    [XmlElement("SomeInfoElementName")] 
    public SomeIntInfo SomeInfo { get; set; } 
} 

hoặc một cách tiếp cận chung chung hơn nếu bạn thích:

public class SomeInfo<T> 
{ 
    [XmlAttribute] 
    public T Value { get; set; } 
} 

public class SomeModel 
{ 
    [XmlElement("SomeStringElementName")] 
    public SomeInfo<string> SomeString { get; set; } 

    [XmlElement("SomeInfoElementName")] 
    public SomeInfo<int> SomeInfo { get; set; } 
} 

Và sau đó:

class Program 
{ 
    static void Main() 
    { 
     var model = new SomeModel 
     { 
      SomeString = new SomeInfo<string> { Value = "testData" }, 
      SomeInfo = new SomeInfo<int> { Value = 5 } 
     }; 
     var serializer = new XmlSerializer(model.GetType()); 
     serializer.Serialize(Console.Out, model); 
    } 
} 

sẽ sản xuất:

<?xml version="1.0" encoding="ibm850"?> 
<SomeModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SomeStringElementName Value="testData" /> 
    <SomeInfoElementName Value="5" /> 
</SomeModel> 
+3

Có, điều đó mang lại cho tôi lược đồ XML mà tôi cần nhưng nó bổ sung thêm mức độ không liên quan và phức tạp cho mô hình. Bây giờ thay vì chỉ Object.SomeProperty, tôi có Object.SomeProperty.Value. Tôi nhận ra rằng tôi có thể không có cả hai cách sử dụng được xây dựng trong serialization - nhưng đó là bản chất của câu hỏi. – IUnknown

+2

Đó là cách trình serializer tích hợp hoạt động. –

+0

Tôi biết điều này là hơi cũ, nhưng tôi sẽ thêm hoạt động ngầm định từ 'T' vào' SomeInfo 'và ngược lại. – Shago

3

Loại, sử dụng XmlAttribute thay vì XmlElement, nhưng nó sẽ không giống như những gì bạn muốn. Nó sẽ trông giống như sau:

<SomeModel SomeStringElementName="testData"> 
</SomeModel> 

Cách duy nhất tôi có thể nghĩ ra để đạt được những gì bạn muốn (natively) sẽ có các thuộc tính trỏ đến đối tượng tên là SomeStringElementName và SomeInfoElementName nơi lớp chứa một getter đơn có tên là " giá trị". Bạn có thể thực hiện bước này thêm một bước nữa và sử dụng DataContractSerializer để các lớp trình bao bọc có thể là riêng tư. XmlSerializer sẽ không đọc các thuộc tính riêng tư.

// TODO: make the class generic so that an int or string can be used. 
[Serializable] 
public class SerializationClass 
{ 
    public SerializationClass(string value) 
    { 
     this.Value = value; 
    } 

    [XmlAttribute("value")] 
    public string Value { get; } 
} 


[Serializable]      
public class SomeModel      
{      
    [XmlIgnore]      
    public string SomeString { get; set; }      

    [XmlIgnore]      
    public int SomeInfo { get; set; } 

    [XmlElement] 
    public SerializationClass SomeStringElementName 
    { 
     get { return new SerializationClass(this.SomeString); } 
    }    
} 
+0

Xin chào Chris, Có, tôi có thể sử dụng XmlAttribute nhưng như bạn đã nói nó không cho kết quả tôi cần. Tôi đã hy vọng có thể nhận được những gì tôi cần mà không cần viết mã tuần tự của riêng tôi. – IUnknown

+0

@IUnknown - Tôi đã ném cùng nhau một cách có thể đạt được những gì bạn muốn. Nó không đẹp, tạo ra các lớp học để có được một nút, vì vậy nếu ai đó biết một cách tốt hơn, tôi sẽ được quan tâm là tốt. –

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