在Silverlight中,克隆业务对象的最佳方法是什么?

8

如何最好地创建DTO的克隆?在Silverlight中没有ICloneable接口或BinaryFormatter类。反射是唯一的方法吗?


你想在服务器端或Silverlight端使用这个克隆功能吗?还是两边都要用? - Zoltan Veres
4个回答

9

以下是我们为克隆编写的代码。此代码适用于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

3

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);
        }
    }

1
如何在我的源是IEnumerable的情况下创建克隆。此LayerDto还具有一些对象类型(例如MetaItemDto)。
代码: public class LayerDto { } public class 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;
        }

}

但我面临的问题是,图层没有显示它的元素(对于每个图层)。

0

我认为标准的克隆功能被省略是为了保持简单和轻量级。不过,我相信您可以使用 JSON 或 XML 序列化来实现同样的功能。但是,我不确定性能成本如何。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接