serialization - 序列化动态 ax 365 数据合约扩展
问题描述
我正在尝试将一些 JSON 输入序列化为 Microsoft Dynamics 365 Finance 中的数据合同。一个简单的数据合同类工作正常,但我无法让数据合同扩展工作。有没有人有这方面的经验,或者可能是一个可行的例子?
我设法找到的关于这个主题的唯一相关信息来自这个论坛帖子。按照一些超链接,您最终会得到官方的 Microsoft 文档 (Ref# 199219),其中指出应该支持这一点。
以下数据合同属性的所有变体都可以正常编译,但对我来说证明是不成功的:
- 使用
DataContract
andDataMember
代替DataContractAttribute
andDataMemberAttribute
。 - 结合
DataContract
和DataContractAttribute
单一的方法。(产生关于双重序列化属性的运行时错误。) DataContractAttribute
在扩展类上重复。
通过其各种构造函数选项对JSON 反序列化器类进行的其他实验也被证明是不成功的:
- 传递已知类型的列表
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();
}
}
结果
解决方案
推荐阅读
- sql - 如何根据同一表中先前列中的值设置标志?(甲骨文)
- c# - 阻止用户回复消息
- angular - mat select 在移动网络上很粘
- azure-pipelines - Azure 管道,最后阶段被跳过,我不明白为什么!是否有审批限制或时间限制?
- puppeteer - 从 puppeteer 中识别相等的字段
- javascript - 以不同的间隔显示图像
- c++ - 添加新模块实例时 V8PP / V8 崩溃
- java - 如何将数据传递给 Springboot 后端点
- javascript - NextJS API“pages/api/contactUs.js”不适用于 Vercel 生产,但在 localhost 上工作正常
- r - 条形图上的标签在 R 中无法正常工作