簡體   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