Dynamics crm 2011 连载及;反序列化CRM EntityCollection

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 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;
}