在没有对象信息的情况下序列化对象

时间:2013-02-04 19:51:58

标签: c# serialization binaryformatter

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

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

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

的要求:

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

是否存在仅序列化对象成员值的方法或API?

2 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分:0)

如果你最终使用Reflection只编写想要的属性,你可能需要考虑一些性能影响。

使用反射很慢。反映类型本身的价格很高,然后通过调用PropertyInfo动态调用PropertyInfo.GetValue非常慢。

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

这会快得多,也不会在GC上造成太大的负担。

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