序列化在远程调用是必不可少的一件武器..平时我们一般也就序列化一些自己定义好的类..在类前面加入可序列化标志即可([Serializable])
所以直接这样..(一般常用的是二进制的哈~)

Code
//序列化
public static byte[] SerializeData(object data)
{
using (MemoryStream memory = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memory, data);
return memory.ToArray();
}
}
//反序列化
public static object DeserializeData(byte[] data)
{
if (data != null)
{
using (MemoryStream memeory = new MemoryStream(data))
{
memeory.Position = 0;
BinaryFormatter binary = new BinaryFormatter();
return (Object)binary.Deserialize(memeory);
}
}
else
return null;
}
但偶尔也会碰到不能序列化的.比如说Pen,Brush,Matrix 这些,难道序列化就行不通了吗?呵呵。.答案是否定的~~
接下来我们需要写一个类来让它可序列化..
比如Pen为例
首先继承ISerializationSurrogate接口: 实现序列化代理项选择器,此选择器允许一个对象对另一个对象执行序列化和反序列化。
它有2个方法 一个是GetObjectData : 使用将对象序列化所需的数据填充所提供的 System.Runtime.Serialization.SerializationInfo。
第二个是 SetObjectData:使用 System.Runtime.Serialization.SerializationInfo 中的信息填充对象。

Code
public class PenSurrogate : ISerializationSurrogate
{
public void GetObjectData(Object obj, SerializationInfo info, StreamingContext context)
{
System.Drawing.Pen pen = (System.Drawing.Pen)obj;
if (pen.Color != Color.Empty)
{
info.AddValue("Color", pen.Color);
info.AddValue("Width", pen.Width);
info.AddValue("Alignment", pen.Alignment);
info.AddValue("CompoundArray", pen.CompoundArray);
info.AddValue("Transform", pen.Transform);
}
}
public Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
Pen pen = new Pen((Color)info.GetValue("Color", typeof(Color)));
pen.Width = (float)info.GetValue("Width", typeof(float));
pen.Alignment = (PenAlignment)info.GetValue("Alignment", typeof(PenAlignment));
try { pen.CompoundArray = (float[])info.GetValue("CompoundArray", typeof(float[])); } catch { }
try { pen.Transform = (Matrix)info.GetValue("Transform", typeof(Matrix)); } catch { }
return pen;
}
}
这里只写了几个Pen 的属性.可以把想要的属性加进来即可,好。我们完成了这个类。继续.该如何用它呢??
我们知道前面序列化过程里 BinaryFormatter 有个属性是SurrogateSelector.
SurrogateSelector ss = new SurrogateSelector();
ss.AddSurrogate(typeof(Pen),new StreamingContext( StreamingContextStates.All),new PenSurrogate ());
formatter .SurrogateSelector =ss;

Code
public static byte[] SerializeData(object data)
{
using (MemoryStream memory = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
SurrogateSelector ss = new SurrogateSelector();
ss.AddSurrogate(typeof(Pen),new StreamingContext( StreamingContextStates.All),new PenSurrogate ());
formatter .SurrogateSelector =ss;
formatter.Serialize(memory, data);
return memory.ToArray();
}
}
序列化和反序列化都要一样..
这样我们就完成了Pen的序列化...今天对序列化的一点小总结..