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

// [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; }
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值