如何在.NET4中访问对象二进制文件?

如何在.NET4中访问对象二进制文件?,.net,serialization,object,binary,.net,Serialization,Object,Binary,我需要读取对象二进制数据(包括私有字段),以特定的方式处理和序列化它们 如何在C#中实现这一点,是否需要MSIL编码?从实现ISerializable开始。该接口允许您手动控制序列化:实际上这很容易。如果您只想读取二进制数据(不是序列化对象,而是原始二进制数据),可以使用BinaryReader您可以使用反射和(可选)动态IL生成来完成 例如,一旦知道类型(即拥有System.type实例),就可以枚举所有字段(type.GetFields()返回FieldInfo对象列表),然后使用GetVa

我需要读取对象二进制数据(包括私有字段),以特定的方式处理和序列化它们


如何在C#中实现这一点,是否需要MSIL编码?

从实现ISerializable开始。该接口允许您手动控制序列化:

实际上这很容易。如果您只想读取二进制数据(不是序列化对象,而是原始二进制数据),可以使用
BinaryReader

您可以使用反射和(可选)动态IL生成来完成

例如,一旦知道类型(即拥有
System.type
实例),就可以枚举所有字段(
type.GetFields()
返回
FieldInfo
对象列表),然后使用
GetValue
方法获取字段值。这适用于私有字段,只要安全信任级别检查通过


这不是很快,因此您可能希望预编译字段访问代码(只有在探查器告诉您之后才进行预编译!)。在这种情况下,您可以使用
System.Reflection.Emit
DynamicMethod
工具。(你可以在Google和MSDN上找到教程;我发现编译一些函数很有帮助,这些函数可以完成我在C#/F#中必须完成的工作,然后在Reflector/ildasm中检查MSIL输出)。

我想知道protobuf net是如何做到的?他们似乎在为属性类自动添加一些MSIL代码。有没有关于在编译和运行时发出/自定义/操作MSIL代码的好书?我不确定是否有;使用MSDN文档和反射器,发射或多或少是简单的。唯一的问题是,如果您的MSIL不正确(即堆栈不平衡或不正确的类型或其他),没有详细的解释,只有一个异常“出错”,因此您必须进行双重和三重检查并猜测。因此,我建议尝试编写一些代码——我想,如果没有书籍,您很快就会得到它。