首页 > 其他分享 >序列化和反序列化

序列化和反序列化

时间:2022-08-27 17:12:36浏览次数:52  
标签:序列化 string fileName new formatter public

序列化方式说明

  • 二进制序列化器:序列化结果人看不懂,但是序列化后体积小

  • soap序列化器:人能看懂,没啥阅读体验,文件体积比较大

  • xml序列化器:可阅读性好,体积中等

  • 序列化为json格式

二进制序列化器

  • 要序列化的实体必须标记[Serializable]特性,表示可以序列化
  • 不想序列化的字段可以标记[NonSerialized]特性

实体

[Serializable]
public class People
{
    public int Id;
    public string Name;
    public string Address;

    [NonSerialized]
    public string Sex;
}

序列化

List<People> peoples = GetPeoples();//创建一个实体集合
string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "BinarySerialize.txt");
using (FileStream fs = new FileStream(fileName,FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(fs, peoples);
}

反序列化

string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "BinarySerialize.txt");
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    BinaryFormatter formatter = new BinaryFormatter();
    List<People> peoples = formatter.Deserialize(fs) as List<People>;
}

序列化结果

​ 一个看不懂的二进制文档

soap序列化器

  • 要序列化的实体必须标记[Serializable]特性,表示可以序列化
  • 不想序列化的字段可以标记[NonSerialized]特性
  • soap不能序列化泛型对象

实体

[Serializable]
public class People
{
    public int Id;
    public string Name;
    public string Address;

    [NonSerialized]
    public string Sex;
}

序列化

List<People> peoples = GetPeoples();
string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "SoapSerialize.txt");
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    SoapFormatter formatter = new SoapFormatter();
    formatter.Serialize(fs, peoples.ToArray());
}

反序列化

string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "SoapSerialize.txt");
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    SoapFormatter formatter = new SoapFormatter();
    People[] peoples = (People[])formatter.Deserialize(fs);
}

序列化结果

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENC:Array SOAP-ENC:arrayType="a1:People[3]" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<item href="#ref-3"/>
<item href="#ref-4"/>
<item href="#ref-5"/>
</SOAP-ENC:Array>
<a1:People id="ref-3" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<Id>1</Id>
<Name id="ref-6">张三</Name>
<Address id="ref-7">江苏</Address>
</a1:People>
<a1:People id="ref-4" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<Id>2</Id>
<Name id="ref-8">李四</Name>
<Address id="ref-9">安徽</Address>
</a1:People>
<a1:People id="ref-5" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<Id>3</Id>
<Name id="ref-10">王五</Name>
<Address id="ref-11">浙江</Address>
</a1:People>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

XML序列化器

  • 创建XML序列化器时需要传入需要序列化的对象的类型
  • 不想序列化的字段可以标记[XmlIgnore]特性

实体

public class People
{
    public int Id;
    [XmlElement(ElementName = "姓名")]//设置节点别名
    public string Name;
    [XmlIgnore]//忽略Address不进行序列化
    public string Address;

    [XmlAttribute(AttributeName = "性别")]//设置这个字段作为xml中的属性出现,并设置了属性名称
    public string Sex;
}

序列化

List<People> peoples = GetPeoples();
string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "XmlSerialize.xml");
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    XmlSerializer formatter = new XmlSerializer(typeof(List<People>));
    formatter.Serialize(fs, peoples);
}

反序列化

string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "XmlSerialize.xml");
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    XmlSerializer formatter = new XmlSerializer(typeof(List<People>));
    List<People> peoples = (List<People>)formatter.Deserialize(fs);
}

序列化结果

<?xml version="1.0"?>
<ArrayOfPeople xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <People 性别="男">
    <Id>1</Id>
    <姓名>张三</姓名>
  </People>
  <People 性别="女">
    <Id>2</Id>
    <姓名>李四</姓名>
  </People>
  <People 性别="男">
    <Id>3</Id>
    <姓名>王五</姓名>
  </People>
</ArrayOfPeople>

序列化为Json格式

  • 安装Nuget包Newtonsoft.Json

序列化和反序列化

List<People> peoples = GetPeoples();
string json = JsonConvert.SerializeObject(peoples);

List<People> newPeople = JsonConvert.DeserializeObject<List<People>>(json);

序列化结果

[{"Id":1,"Name":"张三","Address":"江苏"},{"Id":2,"Name":"李四","Address":"安徽"},{"Id":3,"Name":"王五","Address":"浙江"}]

标签:序列化,string,fileName,new,formatter,public
From: https://www.cnblogs.com/xcoast/p/16630916.html

相关文章

  • 序列化与反序列化
    参考视频:153、序列化和反序列化哔哩哔哩bilibili序列化版本说明参考地址:(18条消息)序列化版本号(serialVersionUID)是做什么用的鲱鱼罐头配白花蛇草水的博客-CSDN博客seria......
  • CTFSHOW Web259 SoapClient原生类的反序列化
      index.php   看到该题目第一眼,大脑直接一个简单的想法就是通过访问flag.php添加X-Forwarded-For然后POST发送token数据。但!在本题的环境当中,由于使用了Clou......
  • rest_framework:序列化器类
    一.序列化器类序列化就是把数据转换为json在服务端发送到客户端反序列化是客户端法的数据发送到服务端服务端通过反序列化把数据转换为jsonfromrest_frameworkimp......
  • 面试题:Java序列化与反序列化
    目录序列化和反序列化的概念应用场景?序列化实现的方式继承Serializable接口,普通序列化继承Externalizable接口,强制自定义序列化serialVersionUID的作用静态变量不会被序列......
  • DRF当中序列化器中通过重写create()来实现保护登录保护
    在DRF原来源码框架中,我们知道保存的用户信息时,用户的密码是被明文保存到数据库中。代码实classUserRegisterModelSerializer(serializers.ModelSerializer)   """......
  • 序列化和反序列化
    序列化:把对象变成字符串。一般对象和json格式一样。反序列化:把json字符串转化为对象类型。 参考资料:C#JsonConvert.DeserializeObject反序列化与JsonConvert.Serial......
  • 序列化与反序列化的用法
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.Serialization.Formatters.Binary;usingSystem.IO;n......
  • fastjson反序列化CNVD-2019-22238
    漏洞原理:fastjson是阿里的开源json解析库,用来将json字符串反序列化为JavaBean类,或者将JavaBean类序列化为json字符串。在java审计中,需要关注的关键字:JSON.parse,......
  • C++反序列化--一种基于class infomation反射库的反序列化数据结构
    序列化与反序列化概念:将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将程序数据转化成能被存储并传输的格式的......
  • 关于Android中接口Reponse反序列化的思考
    总结kotlindataclass返回值最佳实践,使用ks!字段全写默认值,不可空,取消全部问号!ks速度更快并且支持N多数据类型protobuf+jsonkt默认值只有两种方式可以获取使用k......