C# 序列化实现类的深拷贝

来源:互联网 发布:销售奖励政策 知乎 编辑:程序博客网 时间:2024/06/13 09:05

// [Serializable] 标记在类上方,我的这串代码就可以使用了

using System;using System.IO;using System.Reflection;using System.Reflection.Emit;using System.Runtime.Serialization.Formatters.Binary;static class Program{    [Serializable]    public class Demo    {    }    [STAThread]    static void Main()    {        var _this = new Demo();        var _obj = demo.Clone();    }    public static object Clone(this object obj)    {        var Dyn = new DynamicMethod("Clone", typeof(object), new Type[] { typeof(object) });        var MDIL = Dyn.GetILGenerator();        var NULL = new Type[] { };        var IL_0033 = MDIL.DefineLabel();        var IL_DE84 = MDIL.DeclareLocal(typeof(MemoryStream));        var Il_FA10 = MDIL.DeclareLocal(typeof(BinaryFormatter));        var Il_BCC2 = MDIL.DeclareLocal(typeof(Object));        var IL_CS10 = MDIL.DeclareLocal(typeof(Object));        MDIL.Emit(OpCodes.Newobj, typeof(MemoryStream).GetConstructor(NULL));        MDIL.Emit(OpCodes.Stloc_0);        MDIL.Emit(OpCodes.Newobj, typeof(BinaryFormatter).GetConstructor(NULL));        MDIL.Emit(OpCodes.Stloc_1);        MDIL.Emit(OpCodes.Ldloc_1);        MDIL.Emit(OpCodes.Ldloc_0);        MDIL.Emit(OpCodes.Ldarg_0);        MDIL.Emit(OpCodes.Callvirt, typeof(BinaryFormatter).GetMethod("Serialize", new Type[] { typeof(MemoryStream), typeof(Object) }));        MDIL.Emit(OpCodes.Ldloc_0);        MDIL.Emit(OpCodes.Ldc_I4_0);        MDIL.Emit(OpCodes.Conv_I8);        MDIL.Emit(OpCodes.Ldc_I4_0);        MDIL.Emit(OpCodes.Callvirt, typeof(MemoryStream).GetMethod("Seek", new Type[] { typeof(Int64), typeof(SeekOrigin) }));        MDIL.Emit(OpCodes.Pop);        MDIL.Emit(OpCodes.Ldloc_1);        MDIL.Emit(OpCodes.Ldloc_0);        MDIL.Emit(OpCodes.Callvirt, typeof(BinaryFormatter).GetMethod("Deserialize", new Type[] { typeof(MemoryStream) }));        MDIL.Emit(OpCodes.Stloc_2);        MDIL.Emit(OpCodes.Ldloc_0);        MDIL.Emit(OpCodes.Callvirt, typeof(MemoryStream).GetMethod("Close", NULL));        MDIL.Emit(OpCodes.Ldloc_2);        MDIL.Emit(OpCodes.Stloc_3);        MDIL.Emit(OpCodes.Br_S, IL_0033);        MDIL.MarkLabel(IL_0033);        MDIL.Emit(OpCodes.Ldloc_3);        MDIL.Emit(OpCodes.Ret);        try { return Dyn.Invoke(Dyn, new object[] { obj }); }        catch (Exception) { return null; }    }}


 

0 0