我有一个库(用C#编写),我需要以特定的二进制格式读取/写入我的对象到磁盘(或任何Stream)的表示(以确保与C / Java库实现的兼容性)。该格式需要相当多的位打包和一些DEFLATE'd字节流。但是,我希望我的库尽可能地成为惯用的.NET,因此希望提供尽可能接近正常二进制序列化过程的API。我知道实现IFormatter接口的能力,但是我真的无法重用内置序列化堆栈的任何部分,这是值得这样做,还是只会带来不必要的开销。换句话说:
实施IFormatter和co。
OR
只提供作用于Stream的“序列化”/“反序列化”方法吗?
对于涉及Remoting的任何案例需要序列化语义,下面提到了一个好点。在使用MarshalByRef对象是可行的情况下,我很确定这不会是一个问题,所以将它放在一边使用ISerializable / IFormatter与自定义堆栈有任何好处或缺点(或者,我的理解远程遥控)?
答案 0 :(得分:0)
我一直跟随后者。如果您所做的只是将文件写入特定框架,则重用序列化框架没有多大用处。我遇到使用自定义序列化框架的任何问题的唯一地方是远程处理,你必须使你的对象可序列化。
由于您必须写入特定格式,这可能对您没有帮助,但protobuf和sqlite是进行自定义序列化的好工具。
答案 1 :(得分:0)
我会做前者。界面并不多,因此如果您正在模仿结构,那么添加“: IFormatter
”并获得完全兼容性所需的其他代码也不会花费太多。
答案 2 :(得分:0)
编写自己的序列化代码非常容易且耗时。
作为一个想法 - 您是否考虑过现有的开源便携式格式,例如“protocol buffers”?这是一种高密度二进制序列化格式,支持Google的大部分数据传输等。版本可以使用多种语言 - 包括Java / C ++等(在核心Google发行版中)和vast range of others。
特别是,对于.NET惯用法,protobuf-net看起来像XmlSerializer
或DataContractSerializer
很多(事实上,它甚至可以纯粹用于xml / wcf属性,如果它包含每个元素的顺序) - 或者可以使用特定的protobuf-net属性:
[ProtoContract]
class Person {
[ProtoMember(1)]
public string Name {get;set;}
}
如果您想保证其他实现的可移植性,建议使用“.proto”文件启动“合同优先” - 在这种情况下,类似于:
message person {
required string name = 1;
}
然后可以使用此.proto文件生成任何特定于语言的变体;因此,使用protobuf-net,你可以通过“protogen”运行它(包括在protobuf-net中;并且VS2008附加组件正在进行中);或者对于Java / C ++等,您可以通过“protoc”运行它(包含在Google的protobuf中)。 protobuf-net中的“protogen”目前可以发出C#和VB,但是如果你想使用F#等,它很容易添加另一种语言 - 它只涉及编写(或迁移)xslt。
还有另一个.NET版本是Java版本的更直接的端口;因此,它不是.NET惯用语。这是dotnet-protobufs。