.NET中的大型对象的流式自定义序列化

时间:2010-08-22 14:52:35

标签: .net serialization

在.NET中,我想调用REST样式的Web服务,该服务需要一个POST主体,它是以下形式的类的二进制序列化:

public class Test
{
    public string Name;
    public byte[] Data;
}

比特流应与使用BinaryFormatter.Serialize()时完全相同。问题是数据成员可能非常大,我(作为调用者)反过来从文件流中获取它。我不想首先通过读取文件中的所有数据在内存中创建一个类实例,然后再次序列化它只是为了调用Web服务。相反,我设想使用类似于BinaryWriter但支持类似伪代码的东西:

var w = new MagicBinaryWriter(myOutputStreamToPost);
w.BeginObject(typeof(Test));
w.WriteString("some string");
w.WriteByteArray(myFileStream);
w.EndObject();

值得注意的是,这是将在服务器上运行的代码,可能有许多此功能的并发用户,这就是为什么我要避免将所有数据存储在内存中。

我一直在寻找低级“构建块”接口,可以这么说,最好是BinaryFormatter.Serialize()本身使用的接口,但没有运气。它们存在吗?或者至少非常精确的关于.NET的序列化格式如何看的规格,所以我可以自己动手?

2 个答案:

答案 0 :(得分:1)

为什么不反编译.net程序集并查看BinaryFormatter.Serialize()如何工作?你可以使用redgate或其他一些反编译器。

答案 1 :(得分:1)

您无法实际实现BinaryFormatter的替换。它没有记录它生成的二进制数据的确切格式。并且结构复杂,它向实际对象数据添加元数据,允许读者重建对象的类型。它也不是与集合布局完全一对一的匹配,它在一定程度上展平了对象图,以避免生成过多的元数据。 BinaryFormatter中的代码量非常惊人。

在源头解决这个问题并考虑另一种不会消耗太多内存的数据表示。