簡體   English   中英

序列化字節數組與XML文件

[英]Serialization byte array vs XML file

我大量使用字節數組來傳輸對象,原始數據,通過網絡和返回。 我通過一個類型實現ISerializable來適應java的方法,它包含兩個方法,作為接口的一部分,ReadObjectData和WriteObjectData。 使用此接口的任何類都會將日期寫入字節數組。 像那樣的東西

  class SerializationType:ISerializable
    {
       void ReadObjectData (/*Type that manages the write/reads into the byte array*/){}
       void WriteObjectData(/*Type that manages the write/reads into the byte array*/){}  
    }

寫完所有對象后,我發送一個網絡數組。


這實際上是雙重問題。 這是通過網絡以最高效率(速度,大小)發送數據的正確方法嗎?

您是否會使用此方法將對象寫入文件,而不是通常使用xml序列化?

編輯#1

Joel Coehoorn提到了BinaryFormatter。 我從未使用過這門課。 除了我目前在msdn上看到的內容之外,你會詳細說明,提供好的例子,參考資料,建議,當前的做法嗎?

這應該沒問題,但你正在做已經完成的工作。 查看System.Runtime.Serialization.Formatters.Binary.BinaryFormatter類。

不需要為每種特定類型實現自己的Read / WriteOjbectData()方法,您只需使用已經可以處理大多數任何對象的類。 它基本上需要幾乎任何.Net對象的內存表示的精確副本,並將其寫入流或從流中讀取它:

BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(outputStream, objectToSerialize);

objectToDeserialize = bf.Deserialize(inputStream) as DeserializedType;

確保閱讀鏈接文檔:unicode字符串可能存在問題,並且確切的內存表示並不總是合適的(例如,打開套接字等)。

如果你是簡單,輕量和高效的二進制序列化,請考慮protobuf-net ; 基於谷歌的協議緩沖區格式,但從頭開始實現典型的.NET使用。 特別是,它既可以單獨使用(通過protobuf-net的Serializer ),也可以通過實現ISerializable (並委托給Serializer )通過BinaryFormatter使用。

除了高效之外,這種格式設計為可擴展和可移植(即與java / php / C ++“協議緩沖區”實現兼容),這與BinaryFormatter不同,BinaryFormatter既是特定於實現又是版本不容忍的。 這意味着你不必亂寫任何序列化代碼......

當框架中已有一個接口時,創建自己的ISerializable接口聽起來像是一個災難的配方。 至少給它一個不同的名字。

在閱讀時你會遇到一些問題 - 你將沒有一個實例來調用該方法。 你可能想把它變成一種“工廠”:

public interface ISerializationFactory<T>
{
    T ReadObjectData(Stream input);
    void WriteObjectData(Stream output);
}

至於XML與二進制......它完全取決於情況:有多少數據,你需要向后兼容嗎,.NET中的XML序列化是否已經給你足夠的控制權等等。

是的,這比發送XML要快,因為你將通過網絡發送更少的數據。 即使您壓縮了XML(這將大大減小其大小),您仍然會有壓縮和解壓縮的開銷。 所以我想說在你目前正在做的事情和XML序列化之間,你目前正在使用最有效的解決方案。

但是我很好奇通過使用XML而不是封送對象會導致多少性能損失。 我鼓勵您研究XML序列化的原因是因為您將以一種人類可讀的應用程序中立格式存儲數據。 如果您能夠以不會對應用程序造成性能損失的方式將數據序列化為XML,我建議您進行調查。

關於寫入文件,通常您希望將對象序列化為XML,如果您希望能夠讀取序列化或者可能更改它。 如果您不希望序列化是人類可讀的,那么您也可以重用二進制序列化。

如果您確實希望它是人類可讀的,那么需要考慮XML,但這取決於您需要序列化的數據類型。 XML本質上是遞歸的,因此適用於序列化同樣的遞歸數據。 它不太適合其他類型的數據。

換句話說,選擇適合您需求的持久序列化。 這里沒有單向適合的解決方案。

至於網絡,通常你會希望將大小保持在最低限度,因此XML通常不會是一個很好的選擇,因為它的冗長。

序列化(在Java中)看似簡單。 只要你做簡單的事情(比如從不改變課程)就很容易 - 但是它也有許多“有趣”的東西。

有關Java序列化的詳細討論請參閱Effective Java (特別是第10章)。

對於C#,不確定,但核心問題可能是相同的。

這里有一個關於C#序列化的例子: http//www.codeproject.com/KB/cs/objserial.aspx

XStream庫提供了一種處理序列化的非常好的方法,包括支持XML,JSON和支持自定義轉換器。 具體而言,使用自定義轉換器使我們能夠減少XML冗長並嚴格序列化所需的內容。

XStream沒有要求將所有內容聲明為Serializable,這在使用第三方庫並且需要從該lib序列化類的實例時非常重要,該lib未聲明為Serializable。


答案已被接受,但為了完整性的討論,這里有一個鏈接,可以很好地比較不同的序列化方法/庫:

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

kryo庫看起來非常引人注目的Java序列化。 與XStream類似,它支持自定義轉換器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM