序列化和反序列化(二)--自定义序列化
来源:互联网 发布:商城优化方案 编辑:程序博客网 时间:2024/05/16 08:13
除了常用的序列化方式,我们也可以自己自定义序列化过程。自定义序列化只需要实现ISerializable接口就可以了,它位于System.Runtime.Serialization命名空间。
public interface ISerializable{
void GetObjectData(SerializationInfo info,StreamingContext context)
{}
}
SerialzationInfo有点类似于BinaryWriter和BinaryReader,用于写入和读取对象的属性。它主要包括一组AddValue()方法和一组Get<Type>()方法,还有其他一些属性用于获得程序集和类型信息。StreamingContext则很少用到。
比如:
class Program
{
static void Main(string[] args)
{
SoapFormatter formatter;
if (File.Exists("D:\\Product.xml"))
{
//反序列化
using (FileStream fs = new FileStream("D:\\Product.xml", FileMode.Open, FileAccess.Read))
{
formatter = new SoapFormatter();
Product product = formatter.Deserialize(fs) as Product;
Console.WriteLine(product);
Console.ReadLine();
}
}
else
{
//序列化
string connString = "Data Source=.Initial Catalog=DB;User ID=sa;PassWord=123";
Product item = new Product(connString);
using (FileStream fs = new FileStream("D:\\Product.xml", FileMode.Create))
{
formatter = new SoapFormatter();
formatter.Serialize(fs, item);
Console.ReadLine();
}
}
}
}
[Serializable]
public class Product : ISerializable
{
private string connString;
[NonSerialized]
public SqlConnection conn;
public Product(string connString)
{
this.connString=connString;
}
public void GetObjectData(SerializationInfo info,StreamingContext context)
{
string encrypted = this.connString.Replace("a", "*").Replace("s","+").Replace("i","$");
info.AddValue("encrypted", encrypted);
}
protected Product(SerializationInfo info, StreamingContext context)
{
string encrypted = info.GetString("encrypted");
this.connString = encrypted.Replace("*","a").Replace("+","s").Replace("$","i");
}
public override string ToString()
{
return this.connString;
}
}
上面两处需要注意:
1) 需要定义一个在反序列化时用于还原属性值的构造函数,并且函数签名的格式必须为:<ClassName>(SerializationInfo info,StreamContext context).在本例子中,将这个构造函数声明为protected,它只有在反序列化时通过反射来调用,将其声明为protected可以避免该构造函数在其他情况下被调用。
2)AddValue(string name,object value)和GetString(string name)中的参数值name必须要保持一致,单不一定与类型的字段或属性名相同。
- 序列化和反序列化(二)--自定义序列化
- 序列化和反序列化(二)
- C#序列化和反序列化之二 自定义序列化
- 序列和反序列化
- 序列和反序列化
- jackson中自定义处理序列化和反序列化
- Json-lib 自定义序列化和反序列化
- jackson中自定义处理序列化和反序列化
- Gson解析之自定义序列化和反序列化
- 序列化和反序列化( 二)
- Python3学习(33)--序列和反序列化(二)
- .net 序列化、反序列化之自定义序列化
- 序列化和反序列化
- 序列化和反序列化
- 序列化和反序列化
- c# 序列化和反序列化
- .NET序列化和反序列化
- .net序列化和反序列化
- c++ 冒号:和双冒号::
- 背景图片如何自适应屏幕
- Pokémon Go呼应设计:让全世界玩家疯狂沉迷
- 如何快速转载CSDN中的博客
- 从23/2 开始写我自己的博客!
- 序列化和反序列化(二)--自定义序列化
- jquery 插件方法 将form表单转换成json串对象
- thinkPHP中的method_exits()方法
- 2017年寒假集训分组测试赛2 Ranklist
- CREELINKS平台_处理器CeCcp资源使用说明(CeCcp的配置与使用)
- flex 弹性布局
- Linux单机TCP并发连接
- 正确理解ThreadLocal
- 110. Balanced Binary Tree