Сериализация динамика Axe 365 данных контракта расширения - PullRequest
4 голосов
/ 23 января 2020

Я пытаюсь сериализовать некоторые JSON входные данные для контракта данных в Microsoft Dynamics 365 Finance. Простой класс контракта данных работает нормально, но я не могу заставить работать расширения контракта данных. Есть ли у кого-нибудь опыт работы с этим или, возможно, рабочим примером?

Единственная связанная с этим информация, которую мне удалось найти по этой теме c, получена из этого сообщения на форуме . Перейдите по некоторым гиперссылкам, и в результате вы получите официальную документацию Microsoft (Ref # 199219) , в которой говорится, что это должно поддерживаться.

Все варианты атрибутов контракта данных, указанные ниже, скомпилируются в порядке, но оказалось неудачным для меня:

  • Использование DataContract и DataMember вместо DataContractAttribute и DataMemberAttribute.
  • Объединение DataContract и DataContractAttribute на одном метод. (Создает ошибку времени выполнения для атрибута двойной сериализации.)
  • Повтор DataContractAttribute для класса расширения.

Дополнительные эксперименты с классом десериализации JSON через различные параметры конструктора также не удалось:

  • Передача списка известных типов ClassA и ClassA_Extension.
  • Передача списка известных типов ClassA_Extension и ClassA (в случае, если порядок списков оказал влияние).
  • Передача объекта настроек и явная установка IgnoreExtensionDataObject в false (это похоже на значение по умолчанию).
  • Передача расширения тип класса в качестве первого параметра.

Обновление

В Microsoft была подана заявка на расследование проблемы. В своем ответе они упомянули, что смогли воспроизвести это. Они также заявили, что это «по проекту» и «не будет исправлено» .

Наше окончательное решение, скорее всего, будет следующим:

  1. Построение сопоставления значений DataMemberAttribute и соответствующего метода контракта данных.
  2. Используйте объект JavaScriptSerializer, чтобы превратить JSON во вложенный. NET объект словаря.
  3. Выполните итерацию по объекту словаря и заполните контракт данных с помощью сопоставления.

Пример

Ниже приведен пример для демонстрации моей проблемы. Значения переменных 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();
    }

}

Результат

enter image description here

1 Ответ

1 голос
/ 23 января 2020

Похоже, что у сериализатора есть проблемы. Вы могли бы передать массив Type, аналогичный тому, как это делает FormRunConfigurationPropertyClassList?

enter image description here

...