1

我似乎记得在 CRM 4 中,您可以从磁盘上的文件中检索 EntityCollection。我想将其作为编写备份机制和 CRM Online 实例数据传输的一部分。

但是,这在 CRM 2011 中似乎无法正常工作,因为每个实体的 Attributes 集合都包含一个空 KeyValuePairOfStringObjects 列表,并且每个实体的 FormattedValues 集合包含一个空 KeyValuePairOfStringStrings 列表。

因此,实体属性的名称和值没有包含在序列化中,但是在 VS 调试器中查看时它们肯定具有值。

有没有一种方法可以以编程方式将这些集合存储到文件中,以便以后可以对它们进行反序列化并用于将数据恢复到它们的来源或并行目标实例,例如用于离线测试?

4

2 回答 2

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;
}
于 2014-09-09T10:23:36.007 回答
0

我有完全相同的要求从 CRM FetchRequest 保存原始 EntityCollection 响应。我从标准 XmlSerializer 中得到了与您相同的结果,诀窍是使用 CRM 在后台使用的相同序列化程序。

看一下 DataContractSerializer 类:MSDN 参考在这里

这是我最后写的助手类:

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

然后,您可以读取或写入 byte[] 到磁盘。

于 2014-03-19T08:31:06.810 回答