C#实现对象序列化的三种方式_第1页
C#实现对象序列化的三种方式_第2页
C#实现对象序列化的三种方式_第3页
C#实现对象序列化的三种方式_第4页
C#实现对象序列化的三种方式_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言最近有一些学员问到了一些关于序列化的问题,今天这篇文章,跟大家分享一下在C#开发中,常用的三种序列化的方式。很多小伙伴一提到序列化,都会想到二进制序列化,但其实序列化并不仅仅只是二进制序列化,我们常说的对象序列化有三种方式,分别是二进制序列化、XML序列化及JSON序列化,这三种方式各有各自的优势和不足,实际应用中,大家自己根据实际情况,选择适合的。准备在实现之前,先要做一些准备工作,序列化其实是对象和字符串(文件)之间的互相转换,所以首先我们准备好一个实体类,很简单的Student类:

publicclassStudent

{

publicintStudentId

{

get;

set;

}

publicstringStudentName

{

get;

set;

}

publicstringClassName

{

get;

set;

}

publicoverridestring

ToString()

{

return

StudentId

+

";"

+

StudentName

+

";"

+

ClassName;

}

}这里我重写了ToString方法,便于后续测试时,直观地看到对象的值是否正确。同时我们准备好一个Student对象,后面就一直要对它进行操作了。

classProgram

{

staticvoidMain(string[]

args)

{

Studentstudent

=

new

Student()

{

StudentId

=

10001,

StudentName

=

"小华",

ClassName

=

"软件一班"

};

}

}二进制二进制序列化及反序列化的方式主要是使用BinaryFormatter这个类,序列化代码如下:

BinaryFormatterserializer

=

newBinaryFormatter();

MemoryStreammemStream

=

newMemoryStream();

serializer.Serialize(memStream,

student);

memStream.Close();

stringinfo

=

Encoding.Unicode.GetString(memStream.ToArray());

Console.WriteLine("二进制序列化结果:");

Console.WriteLine(Environment.NewLine);

Console.WriteLine(info);

Console.WriteLine(Environment.NewLine);反序列化代码如下:

memStream

=

newMemoryStream(Encoding.Unicode.GetBytes(info));

student

=

(Student)serializer.Deserialize(memStream);

memStream.Close();

Console.WriteLine("二进制反序列化结果:");

Console.WriteLine(Environment.NewLine);

Console.WriteLine(student.ToString());

Console.WriteLine(Environment.NewLine);最终执行结果如下:我们可以看到二进制序列化的结果是一串乱码,但是我们可以通过反序列化的方式,拿到转换之后的结果。这种方式使用起来比较简单,甚至还有加密的作用,但是也有一些不足:类名上面要加上[Serializable],不加无法序列化

[Serializable]

publicclassStudent

{

publicintStudentId

{

get;

set;

}

publicstringStudentName

{

get;

set;

}

publicstringClassName

{

get;

set;

}

publicoverridestring

ToString()

{

return

StudentId

+

";"

+

StudentName

+

";"

+

ClassName;

}

}序列化的结果非常大,使用System.Text.Encoding.UTF8.GetString(bytes)查看下,发现数据量很大。序列化对象需要完全一致,连命名空间都要相同。XMLXML序列化可提高可读性,以及对象共享和使用的灵活性,XML序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定XML格式的流。XML序列化代码如下:

XmlWriterSettingsxmlSettings

=

newXmlWriterSettings();

xmlSettings.OmitXmlDeclaration

=

true;

xmlSettings.Encoding

=

newSystem.Text.UTF8Encoding(false);

MemoryStreamstream

=

newMemoryStream();

XmlWriterxmlwriter

=

XmlWriter.Create(stream,

xmlSettings);

XmlSerializerNamespacesxmlns

=

newXmlSerializerNamespaces();

xmlns.Add(String.Empty,

String.Empty);

XmlSerializerser

=

newXmlSerializer(typeof(Student));

ser.Serialize(xmlwriter,

student,

xmlns);

stringinfo

=

Encoding.UTF8.GetString(stream.ToArray());

Console.WriteLine("XML序列化结果:");

Console.WriteLine(Environment.NewLine);

Console.WriteLine(info);

Console.WriteLine(Environment.NewLine);XML反序列化代码如下:

XmlReaderxmlReader

=

XmlReader.Create(newStringReader(info),

newXmlReaderSettings());

student

=

(Student)newXmlSerializer(typeof(Student)).Deserialize(xmlReader);

Console.WriteLine("XML反序列化结果:");

Console.WriteLine(Environment.NewLine);

Console.WriteLine(student.ToString());

Console.WriteLine(Environment.NewLine);最终执行结果如下:我们可以直观地看到XML序列化的结果,可读性增强了很多,但是XML有它自身的不足之处。JSONJSON序列化是目前使用很多的一种方式,实现JSON序列化的方式也有很多,我一般会使用NewSoft.Json这个库来做,可以通过Nuget搜索安装。JSON序列化代码如下:

stringinfo

=

JsonConvert.SerializeObject(student);

Console.WriteLine("JSON序列化结果:"

+

Environment.NewLine);

Console.WriteLine(info);

Console.WriteLine(Environment.NewLine);JSON反序列化代码如下:

student

=

(Student)JsonConvert.DeserializeObject(info,

typeof(Student));

Conso

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论