[Serializable]
public class testClass
{
public string name;
}我将这个类序列成xml格式后使用socket发送,客户端反序列化后得到这个类,并可以正常使用一个字符串跟xml序列化后的格式完全一样,我用socket发送,客户反序列化时没有错误,当我使用这个类的实例的时候就报错了,未将对象设置到引用的实例。
public class testClass
{
public string name;
}我将这个类序列成xml格式后使用socket发送,客户端反序列化后得到这个类,并可以正常使用一个字符串跟xml序列化后的格式完全一样,我用socket发送,客户反序列化时没有错误,当我使用这个类的实例的时候就报错了,未将对象设置到引用的实例。
.NET Framework通过Reflection提供自动Serialization的机制。当一个对象被序列化(Serialized)的时候,它的类名, Assembly,以及类实例的所有数据成员都将被写入存储介质中。Serialization引擎保持对所有已经被序列化的对象引用的追踪,以确保相同的对象引用最多只被序列化一次。 通常,一个Serialization过程会由formatter(例如BinaryFormatter)的Serialize方法引发。对象的Serialization过程按照以下规则进行: 1、 检测以确保formatter是否拥有一个代理选择器(surrogate selector)。如果有,检查代理选择器是否持有给定的对象类型。如果有,ISerializable.GetObjectData被调用。 2、 如果formatter没有代理选择器,或者代理选择器没有对象类型,检查对象是否被用Serializable属性标记。如果没有,则抛出SerializationException异常。 3、 如果对象被标记为Serializable,检查对象是否实现了ISerializable接口。如果实现了此接口,则GetObjectData被调用。 4、 如果对象没有实现ISerializable接口,则使用默认的序列化策略,来序列化没有用NonSerialized属性标记的域。
使你的class能够被序列化 通过上面对Serialization过程的分析,我们可以看出,有两种方式可以使一个class能够被序列化:1)将此class简单地标记为 Serializable;2)为此class实现ISerializable接口,并将此class标记为Serializable。 1、 标记Serializable属性
标记Serializable属性的方式是实现Serialization的基本方法。举个简单的例子: [Serializable]
public class testClass
{
public string name;
} 你可以使用BinaryFormatter来将上面的class序列化: testClass test = new testClass();
test.name = "testName"; IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream("test.dat", FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(stream, test); stream.Close(); 就是这么简单,你所要做的就是创建一个Stream和一个formatter的实例,然后调用formatter的Serialize方法。经过 BinaryFormatter serialize的数据仍然能够通过BinaryFormatter deserialize回来,方法与serialize同样简单,这里就不赘述了。希望这些能对你有些帮助。