C#,struct,class,使用BinaryFormatter将对象序列化

拷贝的别人的代码

namespace ClassAndStructTest
{
    //这是一个class,是一种引用类型,没有用Serializable进行标示,因此不能被序列化
    class ClsA
    {
        public string s1;
        public int i2;
    }
    [System.Serializable]//标示了这个类可以被序列化,这个类无法被继承
    class ClsB
    {
        public string s1;
        public int i2;
    }
    //这是一个struct,是一种值类型,
    struct StructA
    {
        public string s1;
        public int i2;
    }
    class Program
    {
        public static void Main()
        {
            //ca2和ca1共用了一块内存.
            ClsA ca1 = new ClsA();
            ca1.s1 = "ca1";
            ClsA ca2 = ca1;
            ca2.s1 = "ca2";
            System.Console.WriteLine("ca1.s1={0}", ca1.s1);

            //sa2和sa1使用了不同的内存.
            StructA sa1 = new StructA();
            sa1.s1 = "sa1";
            StructA sa2 = sa1;
            sa2.s1 = "sa2";
            System.Console.WriteLine("sa1.s1={0}", sa1.s1);

            //因为重新生成了一块内存,所以没啥说的,
            ClsB cb1 = new ClsB();
            cb1.s1 = "cb1";
            ClsB cb2 = ObjectCopy.DeepCopy(cb1);
            cb2.s1 = "cb2";
            System.Console.WriteLine("cb1.s1={0}", cb1.s1);

            return;
        }
    }
    public class ObjectCopy : System.Object
    {
        /// <summary>
        /// 代码来源http://bbs.csdn.net/topics/390307567
        /// 深度拷贝,相当于new,也就是在内存中重新创建,不受原来属性的改变而改变
        /// 错误消息: Additional information: 程序集“xxx”中的类型“yyy”未标记为可序列化。
        /// 解决方案: [System.Serializable]
        /// </summary>
        public static T DeepCopy<T>(T obj)
        {
            T objResult;
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
            {
                //该方法要求:如果当前类的某个属性也是一个对象,则要求该属性对象要序列化
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
                    = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                bf.Serialize(ms, obj);
                ms.Position = 0;
                objResult = (T)bf.Deserialize(ms);
            }
            return objResult;
        }
        /// <summary>
        /// 该方法默认的是浅克隆,即不会克隆对象引用的对象[比如person属性中Address,或者是个整形数组],而只是简单地复制这个引用.
        /// MemberwiseClone方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象.
        /// 如果字段是值类型的,则对该字段执行逐位复制.如果字段是引用类型(字符串很特殊),则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象.
        /// </summary>
        public System.Object ShallowCopy()
        {
            return this.MemberwiseClone();
        }
        /// <summary>
        /// 这个函数很显然运行时会抛出异常 -_-!
        /// </summary>
        public static T ShallowCopy<T>(T obj)
        {
            var x1 = (System.Object)obj;
            var x2 = (ObjectCopy)x1;
            var x3 = x2.ShallowCopy();
            var x4 = (T)x3;
            return x4;
        }
    }
}

完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值