我处于这种情况,我只需要将对象成员的值序列化为文件。
例如,如果对象包含3个字符串成员,我希望序列化的输出只有这3个字符串而没有 Binaryformatter 添加的序列化元数据,如版本,文化和程序集对象的名称。
一个选项只是直接编写对象的每个成员,但我想避免这种情况,因为我有很多需要像这样序列化的类,我不想编写一个处理不同的函数每节课。
的要求:
我希望能够写入任何类型的文件,我希望将成员的值转换为字节(放入缓冲区或直接转换为文件),并能够将这些字节写入特定位置在文件中。
是否存在仅序列化对象成员值的方法或API?
答案 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上造成太大的负担。
您可以考虑的另一个替代方法是在构建时生成代码 - 您可以生成一个类来快速且廉价地序列化您的目标类型。在某些情况下,这是一个不错的选择。