C#对象反序列化与对象序列化
对象序列化的介绍
1、.net支持对象序列化的几种方式
二进制序列化 SOAP序列化 XML序列化
2、几种序列化的区别
二进制格式和SOAP格式可序列化一个类型的所有可序列化字段,不管
使用二进制方式的序列化与反序列化的代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//创建Programmer列表,并添加对象
List<Programmer> list = new List<Programmer>();
list.Add(new Programmer("李志伟", true, "C#"));
list.Add(new Programmer("Coder2", false, "C++"));
list.Add(new Programmer("Coder3", true, "Java"));
//使用二进制序列化对象
string fileName = @"E:\大一\作业\Programmers.dat";//文件名称与路径
Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
binFormat.Serialize(fStream, list);
//使用二进制反序列化对象
list.Clear();//清空列表
fStream.Position = 0;//重置流位置
list = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化对象
foreach (Programmer p in list)
{
Console.WriteLine(p);
}
Console.Read();
}
[Serializable] //必须添加序列化特性
public class Person
{
private string Name;//姓名
private bool Sex;//性别,是否是男
public Person(string name, bool sex)
{
this.Name = name;
this.Sex = sex;
}
public override string ToString()
{
return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");
}
}
[Serializable] //必须添加序列化特性
public class Programmer : Person
{
private string Language;//编程语言
public Programmer(string name, bool sex, string language)
: base(name, sex)
{
this.Language = language;
}
public override string ToString()
{
return base.ToString() + "\t编程语言:" + this.Language;
}
}
}
}
效果
使用SOAP方式的序列化和反序列化
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Soap;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//实例化对象
Programmer p = new Programmer("李志伟", true, "C、C#、C++、Java");
//使用SOAP序列化对象
string fileName = @"E:\大一\作业\Programmers.xml";//文件名称与路径
Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
SoapFormatter soapFormat = new SoapFormatter();//创建SOAP序列化器
soapFormat.Serialize(fStream, p);//SOAP不能序列化泛型对象
//使用SOAP反序列化对象
fStream.Position = 0;//重置流位置
p = null;
p = (Programmer)soapFormat.Deserialize(fStream);
Console.WriteLine(p);
Console.Read();
}
[Serializable] //必须添加序列化特性
public class Person
{
private string Name;//姓名
private bool Sex;//性别,是否是男
public Person(string name, bool sex)
{
this.Name = name;
this.Sex = sex;
}
public override string ToString()
{
return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");
}
}
[Serializable] //必须添加序列化特性
public class Programmer : Person
{
private string Language;//编程语言
public Programmer(string name, bool sex, string language)
: base(name, sex)
{
this.Language = language;
}
public override string ToString()
{
return base.ToString() + "\t编程语言:" + this.Language;
}
}
}
}
效果
使用XML方式的序列化和反序列化
public class Person
{
public string Name;//姓名
public bool Sex;//性别,是否是男
public Person() { }//必须提供无参构造器,否则XmlSerializer将出错
public Person(string name, bool sex)
{
this.Name = name;
this.Sex = sex;
}
public override string ToString()
{
return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");
}
}
public class Programmer : Person
{
public string Language;//编程语言
public Programmer() { }//必须提供无参构造器,否则XmlSerializer将出错
public Programmer(string name, bool sex, string language) : base(name, sex)
{
this.Language = language;
}
public override string ToString()
{
return base.ToString() + "\t编程语言:" + this.Language;
}
}
class Program
{
static void Main(string[] args)
{
//创建Programmer列表,并添加对象
List<Programmer> list = new List<Programmer>();
list.Add(new Programmer("李志伟", true, "C#"));
list.Add(new Programmer("Coder2", false, "C++"));
list.Add(new Programmer("Coder3", true, "Java"));
//使用XML序列化对象
string fileName = @"D:\users\lizw\桌面\Programmers.xml";//文件名称与路径
Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
XmlSerializer xmlFormat = new XmlSerializer(
typeof(List<Programmer>),
new Type[] { typeof(Programmer),typeof(Person) }
);//创建XML序列化器,需要指定对象的类型
xmlFormat.Serialize(fStream, list);
//使用XML反序列化对象
fStream.Position = 0;//重置流位置
list.Clear();
list = (List<Programmer>)xmlFormat.Deserialize(fStream);
foreach (Programmer p in list)
{
Console.WriteLine(p);
}
Console.Read();
}
}
未能改正