我有完全相同的要求,從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));
然後,您可以讀取或寫入字節[]到磁盤。
是不是在SQL水平backuping的選項? –
主要它必須在CRM Online以及前提下工作。而且我想在進程,以便以後保留控制權,以增加更多的功能,允許用戶選擇哪些實體和實體實例被移動,連載到人類可讀(和編輯)XML,並儘量地非序列化回.net XRM對象,如Entity和EntityCollection。 – PaulR
那麼「導出到Excel」功能如何?這會將數據導出爲可讀的XML格式。見http://crmdm.blogspot.be/2011/04/how-to-export-data-from-crm-2011.html –