我正在尝试将一些 JSON 输入序列化为 Microsoft Dynamics 365 Finance 中的数据契约(Contract)。一个简单的数据契约(Contract)类工作正常,但我无法让数据契约(Contract)扩展工作。有没有人有这方面的经验或可能是一个有效的例子?
我设法找到的有关此主题的唯一相关信息来自 this forum post .
按照一些超链接,您最终会得到 official Microsoft documentation (Ref# 199219) ,这表明应该支持这一点。
以下数据契约(Contract)属性的所有变体都可以很好地编译,但对我来说却没有成功:
DataContract
和 DataMember
而不是 DataContractAttribute
和 DataMemberAttribute
. DataContract
和 DataContractAttribute
在单一方法上。 (产生关于双序列化属性的运行时错误。)DataContractAttribute
在扩展类上。 使用 JSON deserializer class 进行的其他实验通过其各种构造函数选项也证明不成功:
ClassA
和 ClassA_Extension
. ClassA_Extension
和 ClassA
(以防列表顺序有影响)。 IgnoreExtensionDataObject
至 false
(这似乎是默认设置)。 更新
向微软提出了一张票来调查这个问题。在他们的回应中,他们提到他们能够重现这一点。他们还声明这是“设计使然”并且“不会被修复”。
我们的最终解决方案很可能如下:
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;
}
}
数据契约(Contract)延期
[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 - 序列化动态 ax 365 数据契约扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881655/