none
请问ObservableCollention<class> 怎样复制 RRS feed

  • 问题

  • 请问ObservableCollention<class> 怎样复制

    就是复制一个新的ObservableCollention<class>,但是之前的数据源发生了变化,不会影响复制出来的数据。

    2016年7月1日 3:44

答案

  • 深拷贝,需要用到序列化和反序列化的知识

    代码例子

      EntityCollection collection = fiscalPeriodManager.FetchPendingInventoryTransaction();

                byte[] bytes = Serialize(collection);
                EntityCollection receiptCollection = (EntityCollection)Deserialize(bytes);

    这样计算出来的和receiptCollection 和collection是两个不同的对象

      public static object Deserialize(byte[] buffer)
            {
                BinaryFormatter binaryF = new BinaryFormatter();
                MemoryStream ms = new MemoryStream(buffer, 0, buffer.Length, false);
                object obj = binaryF.Deserialize(ms);
                ms.Close();
                return obj;
            }

            /// <summary>
            /// 将 obj 对象序列化成 byte[]
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static byte[] Serialize(object obj)
            {
                BinaryFormatter binaryF = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                binaryF.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                byte[] buffer = new byte[(int)ms.Length];
                ms.Read(buffer, 0, buffer.Length);
                ms.Close();
                return buffer;
            }

    参考

    http://www.cnblogs.com/agile2011/archive/2011/06/12/2078959.html


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已建议为答案 DotNet Wang 2016年7月4日 7:49
    • 已标记为答案 彭123 2016年7月6日 13:13
    2016年7月2日 3:10

全部回复

  • 你好 彭123:

    具体语境不清楚,不过你可以尝试一下:

    // collection是已有的ObservableCollention
    var newCollection =new ObservableCollention<class>(collection.ToList());

    2016年7月1日 5:21
  • 深拷贝,需要用到序列化和反序列化的知识

    代码例子

      EntityCollection collection = fiscalPeriodManager.FetchPendingInventoryTransaction();

                byte[] bytes = Serialize(collection);
                EntityCollection receiptCollection = (EntityCollection)Deserialize(bytes);

    这样计算出来的和receiptCollection 和collection是两个不同的对象

      public static object Deserialize(byte[] buffer)
            {
                BinaryFormatter binaryF = new BinaryFormatter();
                MemoryStream ms = new MemoryStream(buffer, 0, buffer.Length, false);
                object obj = binaryF.Deserialize(ms);
                ms.Close();
                return obj;
            }

            /// <summary>
            /// 将 obj 对象序列化成 byte[]
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static byte[] Serialize(object obj)
            {
                BinaryFormatter binaryF = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                binaryF.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                byte[] buffer = new byte[(int)ms.Length];
                ms.Read(buffer, 0, buffer.Length);
                ms.Close();
                return buffer;
            }

    参考

    http://www.cnblogs.com/agile2011/archive/2011/06/12/2078959.html


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已建议为答案 DotNet Wang 2016年7月4日 7:49
    • 已标记为答案 彭123 2016年7月6日 13:13
    2016年7月2日 3:10
  • 您好 彭123,

    >>"但是之前的数据源发生了变化,不会影响复制出来的数据。"

    非常同意@Shuanghua Li的观点。要想之前的数据不影响复制后的数据。必须要使用深拷贝。序列化和反序列话是实现深拷贝的重要手段。您需要对前一个列表中的每一个对象都进行深拷贝,然后把深拷贝后的对象添加到后面的列表中。这样之前的数据改变就不会影响到复制后的数据。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年7月4日 7:49
  • 确实,我是采用序列化的方式解决的,不过我使用的json.net直接序列化为文本,然后再反序列化。
    2016年7月6日 13:13