2012-09-26 133 views
0

我有克隆的动态对象,像这样的代码有问题:克隆动态对象

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; 

我不知道实体的结构提前(仅它将包含的信息,和我不不知道信息的结构),它不会被标记为可序列化。我需要将此信息复制到实体的以前的信息部分。

该代码的执行结果是在fieldFormatter.Serialize行上的'Object reference not set to a instance of a object'。

我该如何检查它是否是一个对象的实例?

可能有(很可能是)循环引用,所以我没有尝试反思,因为我不知道如何处理该问题。速度也不是问题。

+2

'data.Info'是'null'。这就是你获得例外的原因。 –

+0

如果(ReferenceEquals(obj,null))检查那么它是如何通过的? –

+0

有趣。什么是'typeof(T)'和'typeof(T).IsClass'? –

回答

2

如果您不知道数据将被标记为可序列化,那么您不能依赖于使用BinaryFormatter

如果对象可能有循环引用,那么很多其他序列化程序都不可能。

如果我们假设它是一般情况下dynamic(不只是ExpandoObject),那么就没有获得有关成员的信息的方式,因为他们可以为他们查询被发明。

基本上,这种情况*没有很好的答案。没有什么神奇的方法来深入克隆“一件事”。

0

我一直在使用JSON.net来序列化用户定义的类型,它一直运行良好。

有标志忽略空的属性,否则会被默认保存为

{propname: 'undefined'} 

我知道你所说的速度不是一个问题,但串行非常快。

这是nuget package

2

什么

var clone = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(obj));