产品图册用什么软件做,seo技术,wordpress推广机制,湘潭建设厅官方网站在我们深入探时C#序列化和反序列化#xff0c;之前我们先要明白什么是序列化#xff0c;它又称串行化#xff0c;是.ET运行时环境用来支持用户定义 类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去#xff0c;反序列化就是在适当的时候把这个文件再… 在我们深入探时C#序列化和反序列化之前我们先要明白什么是序列化它又称串行化是.ET运行时环境用来支持用户定义 类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去反序列化就是在适当的时候把这个文件再转化 成原来的对象使用。其目的是以某种存储形成使自定义对象持久化或者将这种对像从一个地方传输到另一个地方。.ET框 架提供了两种串行化的方式 1、是使用Binary Formatteri进行串行化 2、使用Soap Formatteri进行串行化 3、使用XmlSerializeri进行串行化。 第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息而第二种将数据流格式化为XL存储第三种其实和 第二种差不多也是XL的格式存储只不过比第二种的XML格式要简化很多去掉了SOAP特有的额外信息。可以使用 [Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化1、2可以使用NonSerialized属性来标志2、 可以使用[Xmllg nore]来标志。 下面就让上我们开始深入了解C序列化和反序列化 C#序列化和反序列化1、使用BinaryFormatteri进行串行化 下面是一个可串行化的类 代码如下
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.Ul;
using System.Web.Ul.WebControls;
using System.Web.Ul.WebControls.WebParts;
using System.Web.Ul.HtmlControls;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
/*summary
/ClassToSerialize的摘要说明
///summary
[Serializable]
public class ClassToSerialize
public int id 100;
public string name Name;
[NonSerialized
public string Sex“男
下面是串行化和反串行化的方法
代码如下
public void SerializeNow()
ClassToSerialize cnew ClassToSerialize();
FileStream fileStream
new FileStream(c:\\temp.dat,FileMode.Create);
BinaryFormatter b new BinaryFormatter();
b.Serialize(fileStream,c);
fileStream.Close();
public void DeSerializeNow()
ClassToSerialize cnew ClassToSerialize();
c.SeX“kkkk;
FileStream fileStream
new FileStream(c:\temp.dat,
FileMode.Open,FileAccess.Read,FileShare.Read);
BinaryFormatter b new BinaryFormatter();
c b.Deserialize(fileStream)as ClassToSerialize;
Response.Write(c.name);
Response.Write(c.Sex);
fileStream.Close();调用上述两个方法可以看到串行化的结果Sex属性因为被标志为NonSerialized,故其值总是为null,
C#序列化和反序列化2、使用SoapFormatteri进行串行化和BinaryFomatter类似我们只需要做一下简单修改即可
a.将usingi语句中的.Formatter.Binaryi改为.Formatter.Soap;
b.将所有的BinaryFormatteri替换为Soap Formatter.
c.确保报存文件的扩展名为.xml
经过上面简单改动即可实现SoapFormatter的串行化这时候产生的文件就是一个ml格式的文件。
C#序列化和反序列化3、使用KmlSerializeri进行串行化
关于格式化器还有一个问题假设我们需要XL,但是不想要SO八P特有的额的外信息那么我们应该怎么办呢有两中方案
要么编写一个实现IFormatter接口的类采用的方式类似于SoapFommatter类但是没有你不需要的信息要么使用库类
XmlSerializer,这个类不使用Serializable属性但是它提供了类似的功能。
如果我们不想使用主流的串行化机制而想使用XmlSeralizer进行串行化我们需要做一下修改
a.添加System.Xml.Serialization命名空间。
b.Serializable和NoSerialized,属性将被忽略而是使用Kmllgnore属性它的行为与NoSerialized类似。
c.XmlSeralizer要求类有个默认的构造器这个条件可能已经满足了。
下面看C#序列化和反序列化示例
要序列化的类
代码如下
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.Ul;
using System.Web.Ul.WebControls;
using System.Web.Ul.WebControls.WebParts;
using System.Web.Ul.HtmlControls;
using System.Xml.Serialization;
代码如下
[Serializable]
public class Person
private string name;
public string Name
get
{
SPAN styleWHITE-SPACE:pre/SPANreturn name;
SPAN styleWHITE-SPACE:pre/SPAN)
SPAN styleWHITE-SPACE:pre/SPANset
SPAN styleWHITE-SPACE:pre/SPAN{
SPAN styleWHITE-SPACE:pre/SPAN
name value;
SPAN styleWHITE-SPACE:pre/SPAN)
public string Sex;
public int Age 31;
public Course[]Courses;
public Person()
public Person(string Name)
SPAN styleWHITE-SPACE:pre/SPANname Name;
SPAN styleVHITE-SPACE:pre/SPANSex“男”
}代码如下:
[Serializable]
public class Course
{
public string Name;
[Xmllgnore]
public string Description;
public Course()
public Course(string name,string description)
SPAN styleWHITE-SPACE:pre/SPANName name;
SPAN styleWHITE-SPACE:pre/SPANDescription description;
}C#序列化和反序列化方法 代码如下:
public void XMLSerialize()
Person c new Person(cyj);
c.Courses new Course[2];
c.Courses[0]new Course(英语”“交流江具)
c.Courses[1]new Course(数学”自然科学)
XmlSerializer xs new XmlSerializer(typeof(Person));
Stream stream new FileStream(c:\cyj.XML,FileMode.Create,FileAccess.Write,FileShare.Read);
xs.Serialize(stream,c);
stream.Close();
public void XMLDeserialize()
XmlSerializer xs new XmlSerializer(typeof(Person));
Stream stream new FileStream(C:\\cyj.XML,FileMode.Open,FileAccess.Read,FileShare.Read);
Person p xs.Deserialize(stream)as Person;
Response.Write(p.Name);
Response.Write(p.Age.ToString());
Response.Write(p.Courses[0].Name);
Response.Write(p.Courses[0].Description);
Response.Write(p.Courses[1].Name);
Response.Write(p.Courses[1].Description);
stream.Close();这里Course类的Description属性值将始终为null生成的xml文档中也没有该节点如下 代码如下:
xml version1.0
Person xmlns:xsi
http://www.w3.org/2001/XMLSchema-instance
xmlns:xsdhttp://www.w3.org/2001/XMLSchema
Sex男/Sex
Age31 /Age
Courses
×Course
Name英语Name
Description交流工具Description
×/Course
Course
Name数学Name
Description自然科学Description
/Course
/Courses
×Namecyj /Name
/PersonC#序列化和反序列化4、自定义序列化
如果你希望让用户对类进行串行化但是对数据流的组织方式不完全满意那么可以通过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法GetObjectData.这个方法用于将对类对象进行串行化所需要的数据填进SerializationInfo)对象。你使用的格式化器将构造SerializationInfo对象然后在串行化时调用GetObjectData.如果类的父类也实现了ISerializable,那么应该调用GetObjectDatal的父类实现。如果你实现了ISerializable,那么还必须提供一个具有特定原型的构造器这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的以防止粗心的开发人员直接使用它。示例如下
C#序列化和反序列化之实现ISerializable的类
代码如下
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.Ul;
using System.Web.Ul.WebControls;
using System.Web.Ul.WebControls.WebParts;
using System.Web.Ul.HtmlControls;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
*lWW×summary
/Employee的摘要说明
1///summary
[Serializable]
public class Employee:ISerializable
public int Empld100;
public string EmpName-刘德华
[NonSerialized]
public string NoSerialString NoSerialString-Test;
public Employee()
SPAN style-WHITE-SPACE:pre”/SPAN∥TODO:在比处添加构造函数逻辑
SPAN style--WHITE-SPACE:pre”/SPAN∥
}
private Employee(Serializationlnfo info,StreamingContext ctxt)
SPAN styleWHITE-SPACE:pre/SPANEmpld (int)info.GetValue(Employeeld,typeof(int));
SPAN styleWHITE-SPACE:pre/SPANEmpName (String)info.GetValue(EmployeeName,typeof(string));
SPAN styleWHITE-SPACE:pre/SPAN//NoSerialString (String)info.GetValue(EmployeeString,typeof(string));
public void GetObjectData(Serializationlnfo info,Streaming Context ctxt)
SPAN styleWHITE-SPACE:pre/SPANinfo.AddValue(Employeeld,Empld);
SPAN styleWHITE-SPACE:pre/SPANinfo.AddValue(EmployeeName,EmpName);
SPAN styleWHITE-SPACE:pre/SPAN//info.AddValue(EmployeeString,NoSerialString);
}C#序列化和反序列化方法 代码如下:
public void OtherEmployeeClassTest()
Employee mp new Employee();
mp.Empld 10;
mp.EmpName“邱t枫”
mp.NoSerialString“你好呀
Stream steam File.Open(c:\temp3.dat,File Mode.Create);
BinaryFormatter bf new BinaryFormatter();
Response.Write(Writing Employee Info:)
bf.Serialize(steam,mp);
steam.Close();
mp null;
C#序列化和反序列化之反序列化
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.Empld);
Response.Write(mp2.EmpName);
Response.Write(mp2.NoSerialString);这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象这种比较简单没有什么可谈的