在C#中调整XmlSerializer的输出

时间:2011-09-02 15:58:34

标签: c# xml-serialization

我想知道是否有办法让C#中的XmlSerializer改变它为一个对象的一个​​属性输出的内容。例如,如果我有类似的东西:

public class MyClass
{
    public string prop1{get;}
    public uint prop2{get;}
    public MyClass2 class2{get;}
    public MyClass3 class3{get;}
}

public class MyClass2
{
    public string prop3{get;}
}

public class MyClass3
{
    //Lots of properties that I want to serialize as normal
}

现在在我的代码中,我有类似的东西:

private void SerializeStuff(List<MyClass> list, string path)
{
    XmlSerializer serialize = new XmlSerializer(typeof(List<MyClass>));
    TextWriter writer = new StreamWriter(path);
    serialize.Serialize(writer, list);
    writer.Close();
}

我想要的是序列化正常工作,但prop3替换为其他一些东西。例如:

<MyClass>
    <prop1>whatever</prop1>
    <prop2>345</prop2>
    <class2>
        <somethingNotProp3>whatever</somethingNotProp3>
        <somethingElseNotProp3>whatever</somethingElseNotProp3>
    </class2>
    <class3>
        ...
    </class3>
</MyClass>

有没有办法自定义XmlSerializer,所以我不必手动编写整个Xml文件,或者没有办法做到这一点?

编辑: 我很确定该解决方案可能与实施ISerializable的{​​{1}}方法有关;但是,我不确定如何实现它。我尝试从GetObjectData继承MyClass2并实施ISerializable,但没有任何改变。 GetObjectData仍然在XML文件中输出。

1 个答案:

答案 0 :(得分:3)

使用System.Xml.Serialization namespace中的属性来影响实例序列化的方式。

如果您需要对属性无法处理的MyClass3非常专业的序列化,那么实现IXmlSerializable interface,这将使您完全控制序列化过程(您甚至可以决定实例 - 实例基础如何序列化内容/属性。)

根据评论,您似乎想要实现IXmlSerializable,因为您想要更改属性的名称​​和值;属性将允许您更改属性/元素/属性的名称,但不允许您对值执行转换(我假设您不想破坏您的表示并为此目的添加额外的属性/值)