Serialization 序列化dynamics ax 365数据协定扩展

Serialization 序列化dynamics ax 365数据协定扩展,serialization,axapta,x++,dynamics-365-operations,Serialization,Axapta,X++,Dynamics 365 Operations,我正在尝试将一些JSON输入序列化到Microsoft Dynamics 365 Finance中的数据契约中。一个简单的数据契约类可以正常工作,但我无法让数据契约扩展正常工作。有没有人有过这方面的经验,或者是一个有效的例子 我在这个主题上找到的唯一相关信息来自。 跟随一些超链接,您将得到,这表明这应该得到支持 以下数据契约属性的所有变体都可以编译,但对我来说都不成功: 使用DataContract和DataMember而不是DataContractAttribute和DataMemberAt

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

我在这个主题上找到的唯一相关信息来自。 跟随一些超链接,您将得到,这表明这应该得到支持

以下数据契约属性的所有变体都可以编译,但对我来说都不成功:

  • 使用
    DataContract
    DataMember
    而不是
    DataContractAttribute
    DataMemberAttribute
  • 在单个方法上组合
    DataContract
    DataContractAttribute
    。(产生有关双重序列化属性的运行时错误。)
  • 在扩展类上重复
    DataContractAttribute
通过各种构造器选项进行的其他实验也被证明是不成功的:

  • 传递已知类型的列表
    ClassA
    ClassA\u扩展名
  • 传递已知类型的列表
    ClassA_Extension
    ClassA
    (以防列表顺序产生影响)
  • 传递设置对象并将
    忽略扩展数据对象
    显式设置为
    false
    (这似乎是默认设置)
  • 将扩展类类型作为第一个参数传递

更新 已向Microsoft提出调查该问题的通知单。在他们的回复中,他们提到他们能够复制这一点。他们还宣布,这是“有意”的,“不会被修正”

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

  • 构建
    DataMemberAttribute
    值与相应数据契约方法的映射
  • 使用
    JavaScriptSerializer
    对象将JSON转换为嵌套的.NET字典对象
  • 迭代dictionary对象,并借助映射填充数据协定

  • 例子 下面是一个模拟的例子来说明我的问题。变量
    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();
        }
    
    }
    
    结果

    [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;
        }
    
    }
    

    序列化程序似乎有问题。您可能能够传递一个
    类型
    数组,类似于
    FormRunConfigurationPropertyClassList
    的传递方式


    谢谢您的意见!我查看了JSON序列化程序,并提供了一些附加参数。不幸的是没有成功。。。我已将我尝试的内容添加到问题描述中。它看起来像一个bug:(这正是我所担心的。如果我通过Microsoft罚单获得任何反馈,那么我将更新此问题。Microsoft反馈已添加为问题中的更新部分…@Sander我在推特上发布了此消息,以查看
    AX
    社区中的任何人是否有任何其他想法或解决方法。但可能无法获得支持。