ISerializable与BinaryFormatter配合,实现将对象序列化成stream,可以保存或网络传输与反序列化

本文详细介绍了如何在C#中使用ISerializable接口配合BinaryFormatter进行对象的序列化与反序列化,通过示例展示了如何创建继承自ISerializable的类并操作stream实现数据持久化和网络传输。

C#中ISerializable与BinaryFormatter配合,可以实现将对象序列化成stream,进而可以保存或网络传输以及进行反序列化。

(注意: 这是一个年代久远了的知识点!)

 

以下是网上一个简单的例子:

​​​​​​https://blog.csdn.net/callmeback/article/details/8299845



 

不解释,看注释。

 

/*

 * Created Date: 2012/12/15

 * 

 * To change this template use Tools | Options | Coding | Edit Standard Headers.

 */

using System;

using System.IO;

using System.Xml;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

using System.Security.Permissions;

 

namespace TestISerializable

{

 /// <summary>

 /// SerialBase:继承自ISerializable

 /// </summary>

 [Serializable]

 public class SerialBase : ISerializable

 {

  public int n1;

  public int n2;

  public String str;

  

  public SerialBase()

  {

  }

  

#region ISerializable Members

  /// <summary>

  /// 构造函数

  /// </summary>

  /// <param name="info"></param>

  /// <param name="context"></param>

  protected SerialBase(SerializationInfo info, StreamingContext context)

  {

   n1 = info.GetInt32("n1");

   n2 = info.GetInt32("n2");

   str = info.GetString("str");

  }

  

  /// <summary>

  /// ISerializable接口函数

  /// </summary>

  /// <param name="info"></param>

  /// <param name="context"></param>

  [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

  public virtual void GetObjectData(SerializationInfo info, StreamingContext context)

  {

   info.AddValue("n1", n1);

   info.AddValue("n2", n2);

   info.AddValue("str", str);

  }

#endregion

 }

 

 [Serializable]

 public class SerialDerived : SerialBase

 {

  public int num;

  

  public SerialDerived() : base()

  {

   

  }

#region ISerializable Members

  /// <summary>

  /// 构造函数

  /// </summary>

  /// <param name="si"></param>

  /// <param name="context"></param>

  protected SerialDerived(SerializationInfo si, StreamingContext context) : base(si, context)

  {

   num = si.GetInt32("num");

  }

  

  /// <summary>

  /// ISerializable接口函数

  /// </summary>

  /// <param name="si"></param>

  /// <param name="context"></param>

  [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

  public override void GetObjectData(SerializationInfo si, StreamingContext context)

  {

   base.GetObjectData(si, context);

   si.AddValue("num", num);

  }

#endregion

 }

 

 class Program

 {

  /// <summary>

  /// 保存

  /// </summary>

  public static void SerializeBinary()

  {

   SerialDerived obj = new SerialDerived();

   obj.n1 = 123;

   obj.n2 = 234;

   obj.str = "dsojgoajd";

   obj.num = 333;

   FileStream stream = new FileStream("test.bin", FileMode.Create);

   BinaryFormatter b = new BinaryFormatter();

   b.Serialize(stream, obj);

   stream.Close();

  }

  

  /// <summary>

  /// 读取

  /// </summary>

  public static void DeserializeBinary()

  {

   SerialDerived obj = new SerialDerived();

   FileStream stream = new FileStream("test.bin", FileMode.Open, FileAccess.Read, FileShare.Read);

   BinaryFormatter b = new BinaryFormatter();

   obj = b.Deserialize(stream) as SerialDerived;

   Console.WriteLine(obj.n1);

   Console.WriteLine(obj.n2);

   Console.WriteLine(obj.str);

   Console.WriteLine(obj.num);

   stream.Close();

  }

 

  public static void Main(string[] args)

  {

   // TODO: Implement Functionality Here

   

   // 保存并且读取为二进制文件

   SerializeBinary();

   DeserializeBinary();

   

   Console.Write("Press any key to continue . . . ");

   Console.ReadKey(true);

  }

 }

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值