serialization - 序列化动态 ax 365 数据契约扩展

标签 serialization axapta x++ dynamics-365-operations

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

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

以下数据契约(Contract)属性的所有变体都可以很好地编译,但对我来说却没有成功:

  • 使用 DataContractDataMember而不是 DataContractAttributeDataMemberAttribute .
  • 合并DataContractDataContractAttribute在单一方法上。 (产生关于双序列化属性的运行时错误。)
  • 重复 DataContractAttribute在扩展类上。

  • 使用 JSON deserializer class 进行的其他实验通过其各种构造函数选项也证明不成功:
  • 传递已知类型列表 ClassAClassA_Extension .
  • 传递已知类型列表 ClassA_ExtensionClassA (以防列表顺序有影响)。
  • 传递设置对象并显式设置 IgnoreExtensionDataObjectfalse (这似乎是默认设置)。
  • 将扩展类类型作为第一个参数传递。


  • 更新

    向微软提出了一张票来调查这个问题。在他们的回应中,他们提到他们能够重现这一点。他们还声明这是“设计使然”并且“不会被修复”。

    我们的最终解决方案很可能如下:
  • 构建 DataMemberAttribute 的映射值和相应的数据契约方法。
  • 使用 JavaScriptSerializer对象将 JSON 转换为嵌套的 .NET 字典对象。
  • 迭代字典对象并在映射的帮助下填充数据协定。


  • 例子

    下面是一个最小的例子来演示我的问题。变量的值 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;
        }
    
    }
    

    数据契约(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();
        }
    
    }
    

    结果

    enter image description here

    最佳答案

    看起来序列化程序有问题。您也许可以通过 Type数组类似于FormRunConfigurationPropertyClassList可以?

    enter image description here

    关于serialization - 序列化动态 ax 365 数据契约扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881655/

    相关文章:

    C++ Boost 序列化 序列化模板派生类

    sql - Microsoft Dynamics SQL 中的日期部分函数错误

    save - 如何在表单中通过代码调用 Ctrl + S?

    java - 如何处理 XStream 中的循环引用?

    c# - BinaryFormatter 忽略程序集版本

    c# - 以人类可读的文本格式序列化

    c# - 在 Windows 身份验证应用程序中从当前用户获取网络凭据

    label - AX 2012 - 如何检索字段的 labelid

    axapta - D365FO 中的命令链(方法包装)结果为 'Object is not set to an instance of an object'

    dynamics-ax-2009 - 我可以使用命令行将项目导出到 XPO 文件吗? (AX 2009)