2013-06-20 34 views
1

我似乎在CRM 4回憶,你可以檢索EntityCollection,並從磁盤上的文件。我想這樣做是爲CRM Online實例編寫備份機制和數據傳輸的一部分。連載和反序列化CRM EntityCollection

但是這似乎在CRM 2011中不能正常工作,因爲每個實體的屬性集合都包含一個空的KeyValuePairOfStringObjects列表,並且每個實體的FormattedValues集合包含一個列表(如果爲空KeyValuePairOfStringStrings)。

所以實體的屬性的名稱和值沒有被列入系列化,但他們在與調試器查看時肯定有值。

有沒有一種方法,我可以編程存儲這些集合到文件,使他們可以在以後反序列化和用於將數據恢復到他們從或到例如用於測試離線並行目標實例從哪裏來?

+0

是不是在SQL水平backuping的選項? –

+0

主要它必須在CRM Online以及前提下工作。而且我想在進程,以便以後保留控制權,以增加更多的功能,允許用戶選擇哪些實體和實體實例被移動,連載到人類可讀(和編輯)XML,並儘量地非序列化回.net XRM對象,如Entity和EntityCollection。 – PaulR

+0

那麼「導出到Excel」功能如何?這會將數據導出爲可讀的XML格式。見http://crmdm.blogspot.be/2011/04/how-to-export-data-from-crm-2011.html –

回答

0

我有完全相同的要求,從CRM FetchRequest保存原始EntityCollection響應返回。我從你的標準XmlSerializer中得到了同樣的結果,訣竅是使用與CRM在底層使用的相同的序列化程序。

看看DataContractSerializer的類:MSDN reference is here

這是輔助類,然後我結束了寫作:

class Serialiser 
    { 
     /// <summary> 
     /// The xml serialiser instance. 
     /// </summary> 
     private readonly DataContractSerializer dataContractSerialiser; 

     /// <summary> 
     /// Initializes a new instance of the <see cref="SerialiserService.Serialiser"/> class. 
     /// </summary> 
     /// <param name="typeToSerilaise">The type to serilaise.</param> 
     public Serialiser(Type typeToSerilaise) 
     { 
      this.dataContractSerialiser = new DataContractSerializer(typeToSerilaise); 
     } 

     /// <summary> 
     /// Serialises the specified candidate. 
     /// </summary> 
     /// <param name="candidate">The candidate.</param> 
     /// <returns>A serialised representaiton of the specified candidate.</returns> 
     public byte[] Serialise(object candidate) 
     { 
      byte[] output; 

      using (var ms = new MemoryStream()) 
      { 

       this.dataContractSerialiser.WriteObject(ms, candidate); 
       var numberOfBytes = ms.Length; 

       output = new byte[numberOfBytes]; 

       // Note: Only copy the exact stream length to avoid capturing trailing null bytes. 
       Array.Copy(ms.GetBuffer(), output, numberOfBytes); 
      } 

      return output; 
     } 

     /// <summary> 
     /// Deserialises the specified serialised instance. 
     /// </summary> 
     /// <param name="serialisedInstance">The serialised instance.</param> 
     /// <returns>A deserialised instance of the specified type.</returns> 
     public object Deserialise(byte[] serialisedInstance) 
     { 
      object output; 

      using (var ms = new MemoryStream(serialisedInstance)) 
      using (var reader = XmlDictionaryReader.CreateTextReader(ms, new XmlDictionaryReaderQuotas())) 
      { 
       output = this.dataContractSerialiser.ReadObject(reader); 
      } 

      return output; 
     } 
    } 

用法:

new Serialiser(typeof(EntityCollection)); 

然後,您可以讀取或寫入字節[]到磁盤。

2

,這裏是我的序列化方法的版本提出@bigtv

private string Serialize(EntityCollection records) 
{ 
    string retVal = null; 
    using(var tw = new StringWriter()) 
    using (var xw = new XmlTextWriter(tw)) 
    { 
     var ser = new DataContractSerializer(typeof(EntityCollection)); 
     ser.WriteObject(xw, records); 
     retVal = tw.ToString(); 
    } 
    return retVal; 
}