C#使用自定义值序列化属性

C#使用自定义值序列化属性,c#,serialization,C#,Serialization,我想序列化一个有很多属性的类。其中一些属性是复杂的。有一些类型是位图、颜色等,它们根本不会被序列化 我采用的方法如下: XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); MemoryStream stream = new MemoryStream(); serializer.Serialize(stream, obj); stream.Flush()

我想序列化一个有很多属性的类。其中一些属性是复杂的。有一些类型是位图、颜色等,它们根本不会被序列化

我采用的方法如下:

        XmlSerializer serializer = new XmlSerializer(typeof(MyObject));

        MemoryStream stream = new MemoryStream();

        serializer.Serialize(stream, obj);

        stream.Flush();
        stream.Seek(0, SeekOrigin.Begin);

        XmlDocument returnDoc = new XmlDocument();
        returnDoc.Load(stream);
如何为这些复杂属性创建“自定义”方法?到目前为止,我自己创建了XML文档,遍历了每个属性并将其转换为文本

我需要的另一个例子是参考资料。这个类有一些对其他类的引用。我不想序列化整个子类,只想序列化它的名称

我相信在如何实现这一点上有不同的方法。最好的办法是什么

我已经开始考虑创建额外的属性并忽略其他属性(
XmlIgnore()
),但这将是一种开销


谢谢

最好的办法是停止尝试序列化域模型,并创建一个DTO模型,该模型以您希望的存储方式(即面向您选择的序列化程序)表示您想要存储的内容


如果要存储位图,则可能需要
byte[]
属性。如果您想存储某物的名称-一个
字符串
。然后在它们之间绘制地图。简单、无痛苦,而且比试图让序列化程序做它不想做的事情容易得多。

对于不可序列化的属性,您需要自己实现序列化。您可以将这些对象序列化为字节数组,然后使用Base64编码将它们放入XML。请查看以下链接:


但是,如果您不需要序列化为XML,则可以使用它来处理所有属性。

我建议automapper在MODL之间进行映射-我消除了很多麻烦。@ChristianSauer有点依赖于这两个模型的关系,但通常是:是;有时:并非真正的选项。仅此应用程序是为.NET 3.5构建的。AutoMapper是.NET 4.0或更高版本。@ElMac非常确定AutoMapper在早期框架版本中已经存在……我现在就是这样做的。。。我只需要让序列化程序使用Base64。。。他只是为此创建了一个新属性?不,二进制序列化不会“对所有属性都有效”。所有序列化程序都有它们支持的场景,也有它们不支持的场景。在其他新闻中:
BinaryFormatter
非常脆弱,不应该对敌人使用