我在使用如下代码克隆动态对象时遇到问题:
public void Execute(IPrepareData entity)
{
try
{
dynamic data = entity.Primary as dynamic;
data.PreviousInfo = deepClone(data.Info);
}
catch (Exception ex)
{
data.Errors.Add(ex.Message);
}
}
private static T deepClone<T>(T obj)
{
if (typeof(T).IsClass || typeof(T).IsArray)
{
if (ReferenceEquals(obj, null))
{
return default(T);
}
}
using (var memoryStream = new MemoryStream())
{
BinaryFormatter fieldFormatter = new BinaryFormatter();
fieldFormatter.Serialize(memoryStream, obj);
memoryStream.Position = 0;
return (T)fieldFormatter.Deserialize(memoryStream);
}
}
dynamic data;
我事先并不知道实体的结构(只是它包含Info,我不知道信息的结构)并且它不会被标记为可序列化。我需要将此信息复制到实体的先前信息部分。
执行此代码的结果是“对象引用未设置为fieldFormatter.Serialize行上的对象实例”。
如何检查它是否是对象的实例?
可能(很可能会是)循环引用,所以我不是在尝试反思,因为我不知道如何处理它。速度也不是问题。
答案 0 :(得分:3)
如果您不知道数据会被标记为可序列化,那么您就不能依赖BinaryFormatter
。
如果对象可能有循环引用,那么很多其他序列化程序都是不可能的。
如果我们假设它是dynamic
的一般情况(而不仅仅是ExpandoObject
),则无法获取有关成员的信息,因为它们可以被发明,因为他们被查询。
基本上,这种情况*没有好的答案。没有神奇的方法来深入克隆“一件事”。
答案 1 :(得分:2)
怎么样?
var clone = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(obj));
答案 2 :(得分:0)
我一直在使用JSON.net来序列化用户定义的类型,并且它一直运行良好。
有些标志可以忽略null属性,或者默认情况下会保存为
{propname: 'undefined'}
我知道你提到速度不是问题,但序列化器非常快。