繁体   English   中英

如何模仿内置的.NET序列化习惯用法?

[英]How to mimic built-in .NET serialization idioms?

我有一个库(用C#编写),我需要以某种二进制格式将对象的表示形式读/写到磁盘(或任何Stream)上(以确保与C / Java库实现兼容)。 该格式需要大量的位打包和一些DEFLATE'd字节流。 但是,我希望我的库尽可能是惯用的.NET,因此希望提供一个与正常二进制序列化过程尽可能接近的API。 我知道实现IFormatter接口的能力,但是由于我确实无法重用内置序列化堆栈的任何部分,值得这样做,还是会带来不必要的开销。 换一种说法:

实现IFormatter和合作。

要么

只是提供对Stream起作用的“序列化” /“反序列化”方法?


下面提到的一个好点是,在涉及Remoting的任何情况下都需要序列化语义。 在使用MarshalByRef对象可行的情况下,我很确定这不会成为问题,因此撇开ISerializable / IFormatter与自定义堆栈的使用,有什么好处或缺点(或者,我的理解是远程处理不正确)?

我一直和后者在一起。 如果您要做的只是将文件写入特定框架,则重用序列化框架没有多大用处。 使用自定义序列化框架遇到任何问题的唯一地方是远程处理时,您必须使对象可序列化。

这可能对您没有帮助,因为您必须写入特定格式,但是protobuf和sqlite是执行自定义序列化的好工具。

我会做前者。 接口没有太多内容,因此,如果您无论如何都模仿该结构,则添加一个“ : IFormatter ”以及获得完全兼容性所需的其他代码不会花费太多。

编写自己的序列化代码容易出错且耗时。

想一想-您是否考虑过现有的开源可移植格式,例如“ 协议缓冲区 ”? 这是一种高密度的二进制序列化格式,为Google的许多数据传输等提供了基础。这些版本可用多种语言提供,包括Java / C ++等(在Google的核心发行版中),以及其他多种语言。

尤其是,对于.NET的习惯用法, protobuf网看起来很像 XmlSerializerDataContractSerializer (事实上,它甚至可以纯粹用XML / WCF属性,如果它包括每个元素的顺序工作) -或者可以使用特定protobuf-净属性:

[ProtoContract]
class Person {
    [ProtoMember(1)]
    public string Name {get;set;}
}

如果要保证可移植到其他实现中,建议使用“ .proto”文件以“ contract first”开头-在这种情况下,类似于:

message person {
    required string name = 1;
}

然后,可以使用此.proto文件生成任何特定于语言的变体。 因此,使用protobuf-net时,您可以通过“ protogen”(包含在protobuf-net中;并且正在开发VS2008附加组件)运行它; 或对于Java / C ++等,您可以通过“协议”(包含在Google的protobuf中)运行它。 protobuf-net中的“ protogen”当前可以发出C#和VB,但是如果您想使用F#等,添加另一种语言非常容易-它只涉及编写(或迁移)xslt。

还有另一个.NET版本,它是Java版本的直接端口。 因此,它不是.NET惯用语。 这是dotnet-protobufs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM