CRM在线插件中“实体”类型的序列化对象

问题描述 投票:0回答:3

我要解决的问题是,我需要将实体的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'不是公开的。'

c# serialization dynamics-crm dynamics-crm-online
3个回答
1
投票

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

充其量您可以使用它的getset成员创建一个datacontract类,然后序列化Entity。但这又需要大量的手工工作。

查看下面2个线程,这将提供有关您的问题的更多信息。

Thread 1

Thread 2


0
投票

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

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

Source.DLaB.Xrm程序包是仅源程序的NuGet程序包,因此您不必ILMerge任何东西。


0
投票

根据所有完成的研究/试验,似乎无法在D365的沙盒环境中序列化实体类型本身的对象。

[最终通过创建具有属性的公共类并映射我需要从实体中获得的项目,然后使用DataContractJsonSerializer序列化自定义类对象,并使用相同的类来解释(反序列化)实体,从而创建了一种解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.