在 CRM 在线插件中序列化 "Entity" 类型的对象

Serialize Objects of type "Entity" in CRM Online Plugin

我要解决的问题是,我需要将实体的 Target/Pre/Post-Image 序列化为 json 字符串。我知道我们不能在插件中包含 nuget 库,因为 ILmerge 不是一个选项。这是我试过的:

var jStr = Serialize((Entity)excutionContext.InputParameters["Target"]);

public static string Serialize<TEntity>(TEntity dataObject)
{
    using (var stream = new MemoryStream())
    {
         var serializer = new DataContractJsonSerializer(typeof(TEntity));
         serializer.WriteObject(stream, dataObject);
         return Encoding.UTF8.GetString(stream.ToArray());
    }
}

但是我遇到了以下异常,无法弄清楚我该怎么做才能解决同样的问题:

System.Security.SecurityException: '数据协定类型 'System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 无法在部分信任中序列化,因为成员 'key' 不是 public。'

据我所知,我们无法在 CRM 中序列化实体。

充其量您可以创建一个数据合同 class 并获取集合成员,然后序列化实体。但这同样需要大量的手动工作。

查看以下 2 个主题,它们提供了有关您的问题的更多信息。

Thread 1

Thread 2

如果您使用 NuGet 的 Source.DLaB.Xrm 库,它包含一个 SerializableEntity class,旨在允许在沙盒插件中进行 Xml 序列化。您应该也可以在此处将其用于您的 JSON:

Serialize(new Source.DLaB.Xrm.Sandbox.Serialization.SerializableEntity(yourSdkEntity))

Source.DLaB.Xrm 包是一个只有源代码的 NuGet 包,所以你不需要 ILMerge 任何东西。