Dynamics crm 2011 连载及;反序列化CRM EntityCollection
我似乎记得在CRM 4中,您可以从磁盘上的文件检索EntityCollection。我想将此作为为CRM Online实例编写备份机制和数据传输的一部分 但是,这在CRM 2011中似乎无法正常工作,因为每个实体的Attributes集合包含一个空KeyValuePairOfStringObjects列表,而每个实体的FormattedValues集合包含一个列表(如果KeyValuePaiRofStringString为空) 因此,实体属性的名称和值没有包含在序列化中,但是在VS调试器中查看时,它们肯定有值Dynamics crm 2011 连载及;反序列化CRM EntityCollection,dynamics-crm-2011,dynamics-crm,dynamics-crm-online,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm Online,我似乎记得在CRM 4中,您可以从磁盘上的文件检索EntityCollection。我想将此作为为CRM Online实例编写备份机制和数据传输的一部分 但是,这在CRM 2011中似乎无法正常工作,因为每个实体的Attributes集合包含一个空KeyValuePairOfStringObjects列表,而每个实体的FormattedValues集合包含一个列表(如果KeyValuePaiRofStringString为空) 因此,实体属性的名称和值没有包含在序列化中,但是在VS调试器中查看时
是否有一种方法可以通过编程将这些集合存储到文件中,以便以后可以对它们进行反序列化,并用于将数据恢复到它们来自的位置或并行目标实例,例如用于脱机测试?我有完全相同的要求,从CRM FetchRequest中保存原始EntityCollection响应。我从标准XmlSerializer获得了与您相同的结果,诀窍是使用CRM在幕后使用的相同序列化程序 看看DataContractSerializer类: 这是我最后写的助手类:
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;
}
}
然后可以将字节[]读或写到磁盘。这是@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;
}
SQL级别的备份不是一种选择吗?主要是它必须适用于CRM在线和内部部署。但我也希望保留对流程的控制权,以便在以后添加更多功能,允许用户选择移动哪些实体和实体实例,序列化为人类可读(和可编辑)的XML,并尝试轻松反序列化回.net XRM对象,如entity和EntityCollection“导出到Excel”功能?将数据导出为可读的XML格式。请参阅感谢Joris-我想通过web服务以编程方式执行此操作。我可以通过CRM Online web服务使用导出到Excel功能吗,
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;
}