【发布时间】:2020-01-23 15:12:23
【问题描述】:
我正在尝试将一些 JSON 输入序列化到 Microsoft Dynamics 365 Finance 中的数据合同。一个简单的数据合同类工作正常,但我无法让数据合同扩展工作。有没有人有这方面的经验或者可能是一个可行的例子?
我设法找到的关于这个主题的唯一相关信息来自this forum post。 按照一些超链接,您最终会得到official Microsoft documentation (Ref# 199219),它表明应该支持这一点。
以下数据合同属性的所有变体都可以正常编译,但对我来说证明是不成功的:
- 使用
DataContract和DataMember代替DataContractAttribute和DataMemberAttribute。 - 在一个方法中结合
DataContract和DataContractAttribute。 (产生关于双重序列化属性的运行时错误。) - 在扩展类上重复
DataContractAttribute。
通过其各种构造函数选项对JSON deserializer class 进行的其他实验也被证明是不成功的:
- 传递已知类型
ClassA和ClassA_Extension的列表。 - 传递已知类型
ClassA_Extension和ClassA的列表(以防列表顺序产生影响)。 - 传递设置对象并将
IgnoreExtensionDataObject显式设置为false(这似乎是默认设置)。 - 将扩展类类型作为第一个参数传递。
更新
已向 Microsoft 提出请求以调查此问题。在他们的回复中,他们提到他们能够重现这一点。他们还声明这是“设计”,“不会被修复”。
我们的最终解决方案很可能如下:
- 构建
DataMemberAttribute值和相应数据协定方法的映射。 - 使用
JavaScriptSerializer对象将 JSON 转换为嵌套的 .NET 字典对象。 - 在映射的帮助下遍历字典对象并填充数据协定。
示例
下面是一个演示我的问题的最小示例。变量value1 和value2 的值按预期填充,但变量value3 保持为空。
数据合约
[DataContractAttribute('Class A')]
public class ClassA
{
protected str value1;
protected str value2;
[DataMemberAttribute('Value1')]
public str value1(str _value1 = value1)
{
value1 = _value1;
return value1;
}
[DataMemberAttribute('Value2')]
public str value2(str _value2 = value2)
{
value2 = _value2;
return value2;
}
}
数据合约扩展
[ExtensionOf(classStr(ClassA))]
public final class ClassA_Extension
{
private str value3;
[DataMemberAttribute('Value3')]
public str value3(str _value3 = value3)
{
value3 = _value3;
return value3;
}
}
序列化代码带有硬编码输入
public class ClassTest
{
public static void main(Args _args)
{
str inputJSON = @'{
"Value1": "abc",
"Value2": "def",
"Value3": "ghi"
}';
ClassA ret = new ClassA();
System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding::UTF8.GetBytes(inputJSON));
System.Runtime.Serialization.Json.DataContractJsonSerializer dcjSer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(ret.GetType());
ret = dcjSer.ReadObject(ms);
ms.Close();
}
}
结果
【问题讨论】:
标签: serialization axapta x++ dynamics-365-operations