0

我处于一种情况,我只需要将对象成员的值序列化到文件中。

例如,如果对象包含 3 个字符串成员,我希望序列化的输出只有这 3 个字符串,而没有Binaryformatter添加的序列化元数据,例如对象的版本、文化和程序集名称。

一种选择是直接编写对象的每个成员,但我想避免这种情况,因为我有很多需要像这样序列化的类,我不想编写一个函数来为每个类以不同的方式处理这个问题。

要求:

我希望能够写入任何类型的文件,我希望将成员的值转换为字节(进入缓冲区或直接进入文件)并能够将这些字节写入文件中的特定位置.

有没有一种方法或 API 只序列化对象成员的值?

4

2 回答 2

1

马坦,

这是我出于完全不同的目的而整理的一些代码,但它需要一个未知对象并将其序列化为 XML 文件(已更新以包含更好的编码实践)。

    void objectToXMLFile(String fn, object o)
    {
        XmlTextWriter textWriter = new XmlTextWriter(fn, null);

        System.Type type = o.GetType();
        PropertyInfo[] piList = type.GetProperties();

        textWriter.WriteStartDocument();

        textWriter.WriteStartElement("attributeList");

        foreach (PropertyInfo pi in piList)
        {
            textWriter.WriteStartElement("attribute");

            textWriter.WriteStartElement("name");
            textWriter.WriteString(pi.Name);
            textWriter.WriteEndElement();

            textWriter.WriteStartElement("value");
            textWriter.WriteString(pi.GetValue(o).ToString());
            textWriter.WriteEndElement();

            textWriter.WriteStartElement("dataType");
            textWriter.WriteString(pi.PropertyType.Name);
            textWriter.WriteEndElement();

            textWriter.WriteEndElement();
        }
        textWriter.WriteEndElement();
        textWriter.WriteEndDocument();
        textWriter.Close();
    }
于 2013-02-04T20:18:10.717 回答
0

如果您最终使用反射仅编写所需的属性,您可能需要考虑一些性能影响。

使用反射很慢。反射类型本身代价很高,然后PropertyInfo通过调用来动态调用PropertyInfo.GetValue很慢。

另一种方法是构建一个调用属性并写入其值的表达式树,然后将此表达式编译为Action. 您可以将这些实例缓存Action在以您正在序列化的对象为键的字典Type中,并在您想要序列化对象时调用正确的实例。

这会快得多,也不会在 GC 上产生太多负载。

您可以考虑的另一种选择是在构建时生成代码 - 您可以生成一个类来快速且廉价地序列化您的目标类型。在某些情况下,这是一个不错的选择。

于 2013-02-04T22:03:38.757 回答