C# 序列化(Serialize)与反序列化(Deserialize)

   序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

 .NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。    可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。

1.BinaryFormatter 

命名空间:System.Runtime.Serialization.Formatters.Binary;
下面先定义一个可序列化类:

复制代码
   
   
[Serializable] // 表示该类可被序列化 class Peoson { public Peoson() { } public Peoson( string name, int age) { this .name = name; this .age = age; } private string name; public string Name { get { return name; } set { name = value; } } [NonSerialized] // 表示下面这个age字段不进行序列化 private int age; public int Age { get { return age; } set { age = value; } } public void SayHi() { Console.WriteLine( " 大家好,我是{0},今年{1}岁 " ,name,age); } }
复制代码

Main函数中:

复制代码
   
   
List < Peoson > listPers = new List < Peoson > (); Peoson per1 = new Peoson( " 张三 " , 18 ); Peoson per2 = new Peoson( " 李四 " , 20 ); listPers.Add(per1); listPers.Add(per2); SerializeMethod(listPers); // ReserializeMethod(); // 反序列化成把上面一行注释掉 执行此行 Console.ReadKey();
复制代码

序列化和反序列化的方法:

复制代码
   
   
static void ReserializeMethod() { // 反序列化 using (FileStream fs = new FileStream( " 1.bin " , FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); List < Peoson > list = bf.Deserialize(fs) as List < Peoson > ; if (list != null ) { for ( int i = 0 ; i < list.Count; i ++ ) { list[i].SayHi(); } } } } static void SerializeMethod(List < Peoson > listPers) { // 序列化 using (FileStream fs = new FileStream( " 1.bin " , FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, listPers); } } }
复制代码

反序列化输出结果:

大家好,我是张三,今年0岁

大家好,我是李四,今年0岁

由此看出,未序列化的字段存储的值为空。

2、使用XmlSerializer进行串行化
    关于格式化器还有一个问题,假设我们需要XML,有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。
    如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:
    a.添加System.Xml.Serialization命名空间。
    b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。
    c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。
序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
xs.Serialize(fs, listPers);
反序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
 List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的二进制序列化反序列化是一种将对象转换为二进制数据流以便存储或传输,并且可以将二进制数据流还原为对象的过程。这种序列化方式可以用于在不同平台或不同应用程序之间传递对象数据。 在C#中,可以使用BinaryFormatter类来进行二进制序列化反序列化操作。下面是一个简单的示例: ```csharp using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } public class Program { public static void Main() { // 创建一个Person对象 Person person = new Person { Name = "Alice", Age = 25 }; // 将对象序列化为二进制数据流 BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, person); // 将二进制数据流反序列化为对象 stream.Position = 0; Person deserializedPerson = (Person)formatter.Deserialize(stream); // 输出反序列化后的对象属性 Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } } ``` 在上面的示例中,我们定义了一个名为Person的类,并使用[Serializable]特性标记该类可以进行序列化。然后,我们创建了一个Person对象,并使用BinaryFormatter类将其序列化为二进制数据流。接着,我们将二进制数据流反序列化为一个新的Person对象,并输出其属性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值