2016-06-29 43 views
-1

我在Windows窗體中創建電話簿,我需要在binaryForm中編寫ContactList以保存數據。如何將對象序列化爲二進制文件?

這樣做的最佳方法是什麼?我可以單獨寫幾個字段嗎?還是我可以寫作然後將其作爲完整對象讀取?

聯繫有這個字段:

  • 的Guid ID
  • 字符串名稱
  • 字符串的lastName
  • 串電子郵件
  • 字符串phoneNumber的
+0

[Binary Serialization](https://msdn.microsoft.com/en-us/library/72hyey7b(v = vs.110).aspx)或者可能考慮使用XML。 –

+0

BinaryFormatter或XmlSerializer –

+0

或任何其他串行器,真的;目前幾乎沒有任何情況推薦使用'BinarySerializer',但大量安全可靠的二進制序列化程序或文本序列化程序 - 通常是json - 存在 –

回答

1

BinaryWriter不提供對象序列化。它允許你編寫你自己的序列化代碼,但你仍然需要做所有的工作 - 它只是處理與流對話的開銷,併爲你做一些原語編碼。如果你的場景很簡單,那可能很好,在這種情況下玩得開心。但是,在大多數情況下,您可能希望將此類代碼推遲到專用序列化庫。在許多情況下,這只是使用json或xml序列化器。如果你真的想要二進制,那麼也沒關係 - BinaryFormatter是內置的,但有lot版本/平臺的問題,我找不到它在我推薦它;但像protobuf-net這樣的其他二進制序列化器很容易使用,效率高,並且可以在各種平臺上工作(披露:我是作者,但它是免費的:我不賣任何東西)。

+0

謝謝Marc,它幫了我,現在我有更多的問題給我的老師:) xml和json對我來說還是外國的,但是會找到更多的信息關於BinarySerializer –

+0

@GiorgiIsaiashvili有很多'XmlSerializer'的例子 - 只是谷歌; json.net有例子; 「吉爾」有例子; protobuf網有例子 - 他們都有例子 –

1

類(需要是Serializable):

[Serializable] 
public class someType 
{ 
    public int X { set; get; } 
    public int Y { set; get; } 
} 

使用二進制編劇:

public static byte[] Serialize(someType obj) 
{ 
    byte[] bytes = null; 

    using (var stream = new MemoryStream()) 
    { 
     using (var writer = new BinaryWriter(stream)) 
     { 
      writer.Write(obj.X); 
      writer.Write(obj.Y); 
     } 

     bytes = stream.ToArray(); 
    } 

    return bytes; 
} 

public static someType Deserialize(byte[] data) 
{ 
    var obj = new someType(); 

    using (var stream = new MemoryStream(data)) 
    { 
     using (var reader = new BinaryReader(stream)) 
     { 
      obj.X = reader.ReadInt32(); 
      obj.Y = reader.ReadInt32(); 
     } 
    } 

    return obj; 
} 

用法:

var obj = new someType() { X = 10 }; 

byte[] data = Serialize(obj); 

someType obj2 = Deserialize(data); 

或者BinaryFormatter

byte[] data = null; 

using (MemoryStream ms = new MemoryStream()) 
{ 
    BinaryFormatter binaryFormatter = new BinaryFormatter(); 
    binaryFormatter.Serialize(ms, obj); 
    data = ms.ToArray(); 
} 

using (MemoryStream ms = new MemoryStream(data)) 
{ 
    BinaryFormatter binaryFormatter2 = new BinaryFormatter(); 
    var objDeserialized = binaryFormatter2.Deserialize(ms) as someType; 
} 
+0

非常感謝,我從你的代碼中學到了很多,但我不能使用屬性..有可能是更簡單的方式,我希望.. –

+0

@GiorgiIsaiashvili你不能在不使用'[Serializable]'屬性的情況下使用'BinaryWriter'。 – user3185569

+1

BinaryWriter不是BinaryFormatter。現在只有Seri​​alizableAttribute不需要你甚至不需要聲明一個類來使用BinaryWriter。 –

相關問題