Я пытаюсь сериализовать некоторые 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 была подана заявка на расследование проблемы. В своем ответе они упомянули, что смогли воспроизвести это. Они также заявили, что это «по проекту» и «не будет исправлено» .
Наше окончательное решение, скорее всего, будет следующим:
- Построение сопоставления значений
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;
}
}
Расширение контракта данных
[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();
}
}
Результат