自定义序列化(将封装后的数据序列化后在反序列化)
来源:互联网 发布:淘宝晒单福利 编辑:程序博客网 时间:2024/05/16 09:54
4、自定义序列化
如果你希望让用户对类进行串行化,但是对数据流的组织方式不完全满意,那么可以通过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法,GetObjectData. 这个方法用于将对类对象进行串行化所需要的数据填进SerializationInfo对象。你使用的格式化器将构造SerializationInfo对象,然后在串行化时调用GetObjectData. 如果类的父类也实现了ISerializable,那么应该调用GetObjectData的父类实现。
如果你实现了ISerializable,那么还必须提供一个具有特定原型的构造器,这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的,以防止粗心的开发人员直接使用它。
示例如下:
实现ISerializable的类:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
/**//// <summary>
/// Employee 的摘要说明
/// </summary>
[Serializable]
public class Employee:ISerializable
{
public int EmpId=100;
public string EmpName="刘德华";
[NonSerialized]
public string NoSerialString = "NoSerialString-Test";
public Employee()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private Employee(SerializationInfo info, StreamingContext ctxt)
{
EmpId = (int)info.GetValue("EmployeeId", typeof(int));
EmpName = (String)info.GetValue("EmployeeName",typeof(string));
//NoSerialString = (String)info.GetValue("EmployeeString",typeof(string));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("EmployeeId", EmpId);
info.AddValue("EmployeeName", EmpName);
//info.AddValue("EmployeeString", NoSerialString);
}
}
序列化和反序列化方法:
public void OtherEmployeeClassTest()
{
Employee mp = new Employee();
mp.EmpId = 10;
mp.EmpName = "邱枫";
mp.NoSerialString = "你好呀";
Stream steam = File.Open("c://temp3.dat", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
Response.Write("Writing Employee Info:");
bf.Serialize(steam,mp);
steam.Close();
mp = null;
//反序列化
Stream steam2 = File.Open("c://temp3.dat", FileMode.Open);
BinaryFormatter bf2 = new BinaryFormatter();
Response.Write("Reading Employee Info:");
Employee mp2 = (Employee)bf2.Deserialize(steam2);
steam2.Close();
Response.Write(mp2.EmpId);
Response.Write(mp2.EmpName);
Response.Write(mp2.NoSerialString);
}
- 自定义序列化(将封装后的数据序列化后在反序列化)
- Java 反序列化 php 序列化后的对象
- TreeSet自定义Comparator后序列化与反序列化问题
- Json序列化和反序列化的简单封装
- C#中将查询的结果集使用json序列化并传输后反序列化
- Java代码如何反序列化PHP序列化数组后的字符串
- .net 序列化、反序列化之自定义序列化
- 序列化和反序列化(二)--自定义序列化
- MFC + 自定义类的序列化与反序列化
- 用fastjson将数据序列化和反序列化给jfinal的model的方案
- json数据的序列化和反序列化
- java中将数据对象序列化后保存到数据库中,并反序列化取出显示
- Java的序列化、反序列化
- 序列化反序列化的使用
- iOS的序列反序列化
- 序列化反序列化
- 序列化 反序列化
- 序列化反序列化
- 改进活动的四个原则
- JavaScript学习笔记 ——最佳实践
- 在程序运行中中止当前方法的运行
- EnableWindow()函数的应用
- 加入CSDN
- 自定义序列化(将封装后的数据序列化后在反序列化)
- Linux信号
- dos 命令小结
- Convert.ToInt32与Int32.Parse区别及Int32.TryParse【转载】
- cache属性
- C++拷贝构造函数的几个细节
- 简单的JAVA HTML服务器
- 关于作者,《软件工程管理应用》
- 什么叫一本好书--《程序员羊皮卷》书评