ISerializable用法(初级)

本文介绍了一个使用 C# 实现自定义类序列化的示例,包括如何定义实现 ISerializable 接口的类,并展示了序列化和反序列化的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

家里只有一台电脑,影响老婆看电视剧了。赶紧拷贝完,洗袜子去...

不解释,看注释。

/*
 * Created by SharpDevelop.
 * User: iwateru
 * Date: 2012/12/15
 * Time: 18:52
 * 
 * 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);
		}
	}
}


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值