C#序列化和反序列化

序列化和反序列化介绍

序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。反之,反序列化根据流重新构造对象。

一、序列化的方式

1)二进制序列化:是一种将数据写到输出流,以使它能够用来自动重构成相应对象的机制。二进制,其名字就暗示它的必要信息是保存在存储介质上,而这些必要信息要求创建一个对象的精确的二进制副本。在二进制(流)序列化中,整个对象的状态都被保存起来,而XML序列化只有部分数据被保存起来。

复制代码
string strobj = “serialization”;
FileStream stream = new FileStream(“C:\Users\Jing\Desktop\11.txt”, FileMode.Create, FileAccess.Write,FileShare.None);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, strobj);
stream.Close();

FileStream readstream = new FileStream(“C:\Users\Jing\Desktop\11.txt”, FileMode.Open, FileAccess.Read,
FileShare.Read);
string readdata = (string)formatter.Deserialize(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();
复制代码
2)SOAP协议是一个在异构的应用程序之间进行信息交互的理想的选择。我们需要在应用程序中添加System.Runtime.Serialization.Formatters.Soap名字空间以便在.Net中使用SOAP序列化。SOAP序列化的主要优势在于可移植性。SoapFormatter把对象序列化成SOAP消息或解析SOAP消息并重构被序列化的对象。

复制代码
string strobj = “serialization”;
FileStream stream = new FileStream(“C:\Users\Jing\Desktop\11.txt”, FileMode.Create, FileAccess.Write ,FileShare.None);
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(stream, strobj);
stream.Close();

FileStream readstream = new FileStream(“C:\Users\JingWang\Desktop\11.txt”, FileMode.Open , FileAccess.Read ,
FileShare.Read );
string readdata = (string)formatter.Deserialize(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();
复制代码
3)XML序列化:将一个对象或参数的公开字段和属性以及方法的返回值转换(序列化)成遵循XSD文档标准的XML流。因为XML是一个开放的标准,XML能被任何需要的程序处理,而不管在什么平台下,因此XML序列化被用到带有公开的属性和字段的强类型类中,它的这些发生和字段被转换成序列化的格式(在这里是XML)存储或传输。”添加System.XML.Serialization引用以使用XML序列化。使用XML序列化的基础是XmlSerializer。

复制代码
string strobj = “test string for serialization”;
FileStream stream = new FileStream(“C:\Users\Jing\Desktop\11.txt”, FileMode.Create, FileAccess.Write ,FileShare.None);
XmlSerializer xmlserializer = new XmlSerializer(typeof(string));
xmlserializer.Serialize(stream, strobj);
stream.Close();

FileStream readstream = new FileStream(“C:\Users\Jing\Desktop\11.txt”, FileMode.Open , FileAccess.Read ,FileShare.Read );
string readdata = (string)xmlserializer.Deserialize(readstream);
Console.WriteLine(readdata);
Console.ReadLine();
复制代码
4)Json序列化:

复制代码
string strobj = “test string for serialization”;
FileStream stream = new FileStream(“C:\Users\Jing\Desktop\11.txt”, FileMode.Create, FileAccess.Write,FileShare.None);
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(string));
formatter.WriteObject(stream, strobj);
stream.Close();

FileStream readstream = new FileStream(“C:\Users\Jing\Desktop\11.txt”, FileMode.Open, FileAccess.Read,FileShare.Read);
string readdata = (string)formatter.ReadObject(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();
复制代码
在C#中,如果想要进行自定义类的序列化,只需要简单地在定义类的时候添加Serializable标签即可。除非类的成员标记了[NonSerializable],序列化会将类中的所有成员都序列化。

[Serializable]
public class Person
{
public string name;
public int age;
}
二、.NET对象和JSON对象之间的转化-JSON.NET

使用JSONSerializer可以非常方便的实现.NET对象与Json数据之间的转化,JSONSerializer会把.NET对象的属性名转化为Json数据中的Key,把对象的属性值转化为Json数据中的value。示例:

Product product = new Product();
product.Name = “Apple”;
product.Price = 3.99M;
var deserialize= JsonConvert.DeserializeObject(urlToJson);
var serialize= JsonConvert.SerializeObject(Product);

序列化和反序列化实例

1.先以要序列化的内容创建类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 序列化
{
    [Serializable]
    class Student
    {
        public string strNum
        { get ; set; } //学号
        public string strName { get; set; } //姓名
        public int intAge { get; set; }     //年龄

        public float Num1 { get; set; }
        public float Num2 { get; set; }
        public float Num3 { get; set; }
        public float Num4 { get; set; }
        public float Num5 { get; set; }
        public float Num6 { get; set; }
        public float Num7 { get; set; }
        public float Num8 { get; set; }

    }
}

2.序列化:

private void button1_Click(object sender, EventArgs e)
        {
            //先创建类
            Student stu = new Student();
            stu.strNum = this.txtNum.Text;
            stu.strName = this.txtName.Text;
            stu.intAge = int.Parse(this.txtAge.Text);
            //在bin文件中创建ini文件
            FileStream fs = new FileStream("stu.ini", FileMode.Create, FileAccess.ReadWrite);
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, stu);
            fs.Close();
            MessageBox.Show("序列化成功");
        }

3.反序列化:

 private void button2_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("stu.ini", FileMode.Open, FileAccess.ReadWrite);
            BinaryFormatter bf = new BinaryFormatter();
            Student stu = (Student)bf.Deserialize(fs);
            this.txtName.Text = stu.strName;
            this.txtNum.Text = stu.strNum;
            this.txtAge.Text = stu.intAge.ToString();
            fs.Close();

        }

序列化集合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值