2012-09-26 136 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));