【问题标题】:C# Serializing properties with custom valuesC# 使用自定义值序列化属性
【发布时间】:2014-08-25 14:10:09
【问题描述】:

我想序列化一个有很多属性的类。其中一些属性很复杂。有一些类型 Bitmap、Color 等等,它们根本不被序列化。

我使用的方法如下:

        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()),但这将是一个开销。

谢谢!

【问题讨论】:

    标签: c# serialization


    【解决方案1】:

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

    但是,如果您不需要序列化为 XML,则可以使用 binary serialization,它适用于所有属性。

    【讨论】:

    • 我现在就是这样做的...我只需要让序列化程序使用Base64...他为此创建了一个新属性?
    • 不,二进制序列化不会“适用于所有属性”。所有序列化程序都有它们支持的场景和不支持的场景。在其他新闻中:BinaryFormatter 非常脆弱,不应该寄希望于敌人
    【解决方案2】:

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

    如果您想存储位图,那么您可能需要byte[] 属性。如果您想存储某物的名称 - string。然后在它们之间映射。简单,无痛,并且比试图让序列化程序做它不想做的事情容易得多。

    【讨论】:

    • 我建议使用 automapper 在 modls 之间进行映射 - 我省去了很多麻烦。
    • @ChristianSauer 有点取决于这两个模型的关系,但通常:是的;有时:不是一个真正的选择
    • 遗憾的是,这个应用程序是为 .NET 3.5 构建的。 AutoMapper 是 .NET 4.0 或更高版本。
    • @ElMac 很确定 AutoMapper 对于早期的框架版本已经存在得很好......
    猜你喜欢
    • 2017-03-05
    • 1970-01-01
    • 2015-07-27
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多