2010-10-01 26 views
6

Trong C#, tôi đang cố gắng để serialize ClassA vào XML:Serialize lớp như XmlElement

[Serializable] 
public ClassA 
{ 
    [XmlElement] 
    public string PropertyA { get; set; } // works fine 

    [XmlElement] 
    public ClassB MyClassB { get; set; } 
} 

[Serializable] 
public ClassB 
{ 
    private string _value; 

    public override string ToString() 
    { 
     return _value; 
    } 
} 

Thật không may, kết quả tuần tự là:

<PropertyA>Value</PropertyA> 
<ClassB /> 

Thay vào đó, tôi muốn nó là:

<PropertyA>Value</PropertyA> 
<ClassB>Test</ClassB> 

... giả định _value == "Test". Làm thế nào để tôi làm điều này? Tôi có để cung cấp tài sản công cộng trong ClassB cho _value không? Cảm ơn!

UPDATE:

Bằng cách thực hiện các giao diện IXmlSerializable trong ClassB (shown here # 12), XML sau đây được tạo:

<PropertyA>Value</PropertyA> 
<ClassB> 
    <Value>Test</Value> 
</ClassB> 

Giải pháp này là gần như chấp nhận được, nhưng nó sẽ được tốt đẹp để loại bỏ các thẻ. Bất kỳ ý tưởng?

Trả lời

3

Như bạn chỉ ra, cách duy nhất để làm điều này là để thực hiện các giao diện IXmlSerializable.

public class ClassB : IXmlSerializable 
{ 
    private string _value; 

    public string Value { 
     get { return _value; } 
     set { _value = value; } 
    } 

    public override string ToString() 
    { 
     return _value; 
    } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     _value = reader.ReadString(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteString(_value); 
    } 

    #endregion 
} 

Serializing trường hợp sau đây ...

ClassB classB = new ClassB() { Value = "this class's value" }; 

sẽ trở lại với xml sau:

<?xml version="1.0" encoding="utf-16"?><ClassB>this class's value</ClassB> 

Bạn có thể muốn làm một số kiểm chứng thực để bạn mã hóa thẻ xml, vv

+1

Ahh, bạn đã cho tôi thấy vấn đề! Tôi đã sử dụng 'WriteElementString (" Value ", _value)' thay vì 'WriteString (_value)'. nhìn theo cách tôi muốn: ' Kiểm tra' – Pakman

3

Bạn đã tự trả lời. nếu bạn xuất phát từ IXmlSerializable, bạn có thể thay đổi phương thức để thực hiện chính xác (hy vọng) những gì bạn muốn:

public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("ClassB",_value); 
    } 
+0

Mã đó sản xuất: ' thử nghiệm ' khi tôi thực sự muốn: ' thử nghiệm ' – Pakman

+1

như vậy, bạn có thể sử dụng WriteString thay vì WriteElementString :-). * chỉnh sửa * - chỉ thấy một người khác nói như vậy :-( – itsho

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