如何最好地创建DTO的克隆?在Silverlight中没有ICloneable接口或BinaryFormatter类。反射是唯一的方法吗?
如何最好地创建DTO的克隆?在Silverlight中没有ICloneable接口或BinaryFormatter类。反射是唯一的方法吗?
以下是我们为克隆编写的代码。此代码适用于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
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);
}
}
{
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;
}
}
但我面临的问题是,图层没有显示它的元素(对于每个图层)。我认为标准的克隆功能被省略是为了保持简单和轻量级。不过,我相信您可以使用 JSON 或 XML 序列化来实现同样的功能。但是,我不确定性能成本如何。