【问题标题】:Serialize dynamics ax 365 data contract extension序列化动态 ax 365 数据合约扩展
【发布时间】:2020-01-23 15:12:23
【问题描述】:

我正在尝试将一些 JSON 输入序列化到 Microsoft Dynamics 365 Finance 中的数据合同。一个简单的数据合同类工作正常,但我无法让数据合同扩展工作。有没有人有这方面的经验或者可能是一个可行的例子?

我设法找到的关于这个主题的唯一相关信息来自this forum post。 按照一些超链接,您最终会得到official Microsoft documentation (Ref# 199219),它表明应该支持这一点。

以下数据合同属性的所有变体都可以正常编译,但对我来说证明是不成功的:

  • 使用DataContractDataMember 代替DataContractAttributeDataMemberAttribute
  • 在一个方法中结合DataContractDataContractAttribute。 (产生关于双重序列化属性的运行时错误。)
  • 在扩展类上重复 DataContractAttribute

通过其各种构造函数选项对JSON deserializer class 进行的其他实验也被证明是不成功的:

  • 传递已知类型ClassAClassA_Extension 的列表。
  • 传递已知类型ClassA_ExtensionClassA 的列表(以防列表顺序产生影响)。
  • 传递设置对象并将IgnoreExtensionDataObject 显式设置为false(这似乎是默认设置)。
  • 将扩展类类型作为第一个参数传递。

更新

已向 Microsoft 提出请求以调查此问题。在他们的回复中,他们提到他们能够重现这一点。他们还声明这是“设计”“不会被修复”

我们的最终解决方案很可能如下:

  1. 构建DataMemberAttribute 值和相应数据协定方法的映射。
  2. 使用 JavaScriptSerializer 对象将 JSON 转换为嵌套的 .NET 字典对象。
  3. 在映射的帮助下遍历字典对象并填充数据协定。

示例

下面是一个演示我的问题的最小示例。变量value1value2 的值按预期填充,但变量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


    【解决方案1】:

    序列化程序似乎有问题。您也许可以传递一个类似于FormRunConfigurationPropertyClassListType 数组?

    【讨论】:

    • 感谢您的意见!我查看了 JSON 序列化程序并提供了一些附加参数。不幸的是没有成功...我已将我尝试的内容添加到问题描述中。
    • 它看起来像一个错误:(
    • 这就是我所担心的。如果我通过 Microsoft 票证获得任何反馈,我将更新此问题。
    • Microsoft 反馈已添加为问题中的更新部分...
    • @Sander 我在推特上发了一条消息,看看AX 社区中是否有人有任何其他想法或解决方法。虽然可能不会受到牵引。 twitter.com/AlexOnDAX/status/1227269448949616640?s=20
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2016-04-28
    • 2012-11-02
    相关资源
    最近更新 更多