2013-03-22 68 views
1

的系列化我試過基本系列化(修改和簡化)MSDN爲例,在http://msdn.microsoft.com/en-us/library/4abbf6k0.aspxC#:簡單類

//the class : 
[Serializable] 
public class MyObject { 
    public byte n1 = 0; 
    public byte n2 = 0; 
} 

//The code 
MyObject obj = new MyObject(); 
obj.n1 = 1; 
obj.n2 = 24; 
IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
formatter.Serialize(stream, obj); 
stream.Close();  

所以,我希望找到2個字節範圍內:0x01爲0x18在MyFile.bin
但它的不是這樣的,我有這樣的結果:

enter image description here

爲什麼會出現這一切。我該如何做我想做的事。

此測試的目的是爲了將它們保存到一個二進制文件

+1

'BinaryFormatter'添加一些關於結構的元數據。但是即使你忽略了它 - 「int」每個都有4個字節,你爲什麼期望看到2個字節有兩個4-by-Int32結構? – 2013-03-22 11:39:37

+0

您應該爲流使用'using'語句,以確保在出現異常時清理資源。 'Close()'不夠安全,因爲它可能會在它到達該語句之前崩潰。 – 2013-03-22 11:52:48

+0

對不起,在發佈MyObject類的兩個成員都是字節(但我不知道如何編輯我的問題)之前我沒有糾正 – lolonapoli 2013-03-22 12:59:07

回答

0

串行器還存儲有關已序列化的對象的類型的信息來序列更配合物的結構。 在反序列化過程中使用此信息,以便實例化適當類的實例。

我想建議你看看protobuf-net二進制序列化。它速度很快,並且處理對類的更改優於BinaryFormatter。這可能比創建自己的序列化機制更安全。

+1

雖然這是真的,但它不回答OPs問題 – 2013-03-22 11:41:08

+0

它回答'爲什麼是有所有這一部分...... – 2013-03-22 11:42:43

+0

那麼最明確的部分'怎麼樣,我怎麼能做我想做的事情? – 2013-03-22 11:43:21

0

.Net對象的序列化很複雜。它還存儲元數據以重新生成.Net類,因此不要期望它根據類成員進行對齊。它是一種專有格式,只有.Net框架才能對類進行反序列化。

如果你想以這種方式序列化,你應該編寫自定義的序列化函數,它覆蓋默認的序列化和序列化你自己的類。