2013-03-22 150 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框架才能对类进行反序列化。

如果你想以这种方式序列化,你应该编写自定义的序列化函数,它覆盖默认的序列化和序列化你自己的类。