我想知道是否有办法让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文件中输出。
答案 0 :(得分:3)
使用System.Xml.Serialization
namespace中的属性来影响实例序列化的方式。
如果您需要对属性无法处理的MyClass3
非常专业的序列化,那么实现IXmlSerializable
interface,这将使您完全控制序列化过程(您甚至可以决定实例 - 实例基础如何序列化内容/属性。)
根据评论,您似乎想要实现IXmlSerializable
,因为您想要更改属性的名称和值;属性将允许您更改属性/元素/属性的名称,但不允许您对值执行转换(我假设您不想破坏您的表示并为此目的添加额外的属性/值)