我在Windows窗體中創建電話簿,我需要在binaryForm中編寫ContactList以保存數據。如何將對象序列化爲二進制文件?
這樣做的最佳方法是什麼?我可以單獨寫幾個字段嗎?還是我可以寫作然後將其作爲完整對象讀取?
聯繫有這個字段:
- 的Guid ID
- 字符串名稱
- 字符串的lastName
- 串電子郵件
- 字符串phoneNumber的
我在Windows窗體中創建電話簿,我需要在binaryForm中編寫ContactList以保存數據。如何將對象序列化爲二進制文件?
這樣做的最佳方法是什麼?我可以單獨寫幾個字段嗎?還是我可以寫作然後將其作爲完整對象讀取?
聯繫有這個字段:
BinaryWriter
不提供對象序列化。它允許你編寫你自己的序列化代碼,但你仍然需要做所有的工作 - 它只是處理與流對話的開銷,併爲你做一些原語編碼。如果你的場景很簡單,那可能很好,在這種情況下玩得開心。但是,在大多數情況下,您可能希望將此類代碼推遲到專用序列化庫。在許多情況下,這只是使用json或xml序列化器。如果你真的想要二進制,那麼也沒關係 - BinaryFormatter
是內置的,但有lot版本/平臺的問題,我找不到它在我推薦它;但像protobuf-net
這樣的其他二進制序列化器很容易使用,效率高,並且可以在各種平臺上工作(披露:我是作者,但它是免費的:我不賣任何東西)。
謝謝Marc,它幫了我,現在我有更多的問題給我的老師:) xml和json對我來說還是外國的,但是會找到更多的信息關於BinarySerializer –
@GiorgiIsaiashvili有很多'XmlSerializer'的例子 - 只是谷歌; json.net有例子; 「吉爾」有例子; protobuf網有例子 - 他們都有例子 –
類(需要是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;
}
非常感謝,我從你的代碼中學到了很多,但我不能使用屬性..有可能是更簡單的方式,我希望.. –
@GiorgiIsaiashvili你不能在不使用'[Serializable]'屬性的情況下使用'BinaryWriter'。 – user3185569
BinaryWriter不是BinaryFormatter。現在只有SerializableAttribute不需要你甚至不需要聲明一個類來使用BinaryWriter。 –
[Binary Serialization](https://msdn.microsoft.com/en-us/library/72hyey7b(v = vs.110).aspx)或者可能考慮使用XML。 –
BinaryFormatter或XmlSerializer –
或任何其他串行器,真的;目前幾乎沒有任何情況推薦使用'BinarySerializer',但大量安全可靠的二進制序列化程序或文本序列化程序 - 通常是json - 存在 –