【问题标题】:What is the best way to clone a business object in Silverlight?在 Silverlight 中克隆业务对象的最佳方法是什么?
【发布时间】:2008-10-14 20:38:55
【问题描述】:

创建 DTO 克隆的最佳方法是什么? Silverlight 中没有 ICloneable 接口或 BinaryFormatter 类。反思是唯一的方法吗?

【问题讨论】:

  • 您想在服务器端还是 Silverlight 端使用此克隆功能?还是两边?

标签: silverlight-2.0 clone


【解决方案1】:

这是我们提出的用于克隆的代码。这适用于 Silverlight 2 和 3。

Public Shared Function Clone(Of T)(ByVal source As T) As T
    Dim serializer As New DataContractSerializer(GetType(T))
    Using ms As New MemoryStream
        serializer.WriteObject(ms, source)
        ms.Seek(0, SeekOrigin.Begin)
        Return DirectCast(serializer.ReadObject(ms), T)
    End Using
End Function

【讨论】:

    【解决方案2】:

    ICloneable 在 Silverlight 4 中不可用(我不知道 1/2/3 或即将发布的版本)。它已从 Silverlight 4 的公共 API 中删除。 来自 Mike Schall 代码的帮助;它对我有用。

    public LayerDto Clone(LayerDto source)
        {
    
            DataContractSerializer serializer = new DataContractSerializer(typeof(LayerDto));
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, source);
                ms.Seek(0, SeekOrigin.Begin);
                return (LayerDto)serializer.ReadObject(ms);
            }
        }
    

    【讨论】:

      【解决方案3】:

      如果我的源是 IEnumerable,如何创建克隆。这个 LayerDto 也有一些对象类型(例如 MetaItemDto)。

      代码:

      公共类LayerDto { }
      公共类 MetaItemDtoList : System.Collections.ObjectModel.ObservableCollection { }

      public static IEnumerable Clone(IEnumerable source)

      {

              IEnumerable<LayerDto> layers;
      
              DataContractSerializer serializer = new DataContractSerializer(typeof(IEnumerable<LayerDto>));
              using (MemoryStream ms = new MemoryStream())
              {
                  serializer.WriteObject(ms, source);
                  ms.Seek(0, SeekOrigin.Begin);
                  //return (IEnumerable<LayerDto>)serializer.ReadObject(ms);
                  layers = (IEnumerable<LayerDto>)serializer.ReadObject(ms);
                  return layers;
              }
      

      }

      但我面临的问题是该层没有显示它的元项目(对于每一层)。

      【讨论】:

        【解决方案4】:

        我相信标准的克隆功能被省略了,以保持它的简单和轻便。我相信您可以使用 JSON 或 XML 序列化来实现相同的目标。但不确定性能成本。

        【讨论】:

          猜你喜欢
          • 2021-06-29
          • 1970-01-01
          • 1970-01-01
          • 2011-09-24
          • 2021-03-20
          相关资源
          最近更新 更多