Сериализуйте значение класса ToString () как XmlElement - PullRequest
6 голосов
/ 02 октября 2010

В C # я пытаюсь сериализовать ClassA в XML:

[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;
    }
}

К сожалению, сериализованный результат:

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

Вместо этого я хочу, чтобы это было:

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

... при условии _value == "Test". Как мне это сделать? Должен ли я иметь для предоставления публичной собственности в ClassB для _value? Спасибо!

UPDATE:

Реализуя интерфейс IXmlSerializable в ClassB (, показанный здесь # 12), генерируется следующий XML:

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

Это решение почти приемлемо, но было бы неплохо избавиться от тегов. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 05 октября 2010

Как вы указали, единственный способ сделать это - реализовать интерфейс 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
}

Сериализация следующего экземпляра ...

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

вернет следующий xml:

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

Возможно, вы захотите выполнить некоторые проверки, чтобы кодировать XML-теги и т. Д.

3 голосов
/ 05 октября 2010

Вы ответили сами. если вы наследуете от IXmlSerializable, вы можете изменить метод так, чтобы он делал (надеюсь) то, что вы хотите:

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