using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
mc.MyEvent += foo;
mc.Raise(getMemory(mc));
//序列化
Stream file = new FileStream("D:\\dat.bin", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
IFormatter fmt = new BinaryFormatter();
fmt.Serialize(file, mc);
file.Close();
//反序列化
file = new FileStream("D:\\dat.bin", FileMode.Open, FileAccess.Read, FileShare.None);
mc = fmt.Deserialize(file) as MyClass;
file.Close();
mc.Raise(getMemory(mc));
}
static void foo(string addr)
{
Console.WriteLine(addr);
}
/// <summary>
/// 获取引用类型的内存地址
/// </summary>
/// <param name="o">对象</param>
/// <returns>内存地址(十六进制)</returns>
static string getMemory(object o)
{
GCHandle h = GCHandle.Alloc(o, GCHandleType.WeakTrackResurrection);
IntPtr addr = GCHandle.ToIntPtr(h);
return "0x" + addr.ToString("X");
}
}
[Serializable]
class MyClass
{
public event Action<string> MyEvent;
public void Raise(string addr)
{
MyEvent?.Invoke(addr);
}
}
}
C#事件可以被序列化和反序列化
最新推荐文章于 2022-04-22 21:54:27 发布