我要解决的问题是,我需要将实体的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'不是公开的。'
如果使用NuGet的Source.DLaB.Xrm库,它包含一个SerializableEntity类,该类旨在允许在沙盒插件中进行Xml序列化。您也应该可以在此处将其用于JSON:
Serialize(new Source.DLaB.Xrm.Sandbox.Serialization.SerializableEntity(yourSdkEntity))
Source.DLaB.Xrm程序包是仅源程序的NuGet程序包,因此您不必ILMerge任何东西。
根据所有完成的研究/试验,似乎无法在D365的沙盒环境中序列化实体类型本身的对象。
[最终通过创建具有属性的公共类并映射我需要从实体中获得的项目,然后使用DataContractJsonSerializer序列化自定义类对象,并使用相同的类来解释(反序列化)实体,从而创建了一种解决方法。