Сериализация и десериализация свойства с динамически присвоенным именем свойства на основе типа, указанного в атрибуте.C#

Место общения программистов C#
Ответить
Anonymous
 Сериализация и десериализация свойства с динамически присвоенным именем свойства на основе типа, указанного в атрибуте.

Сообщение Anonymous »

Я использую newtonsoft.json.
У меня есть классы, созданные из XSD в C#.
Внутри этих классов есть некоторые свойства, имена которых должны динамически меняться при сериализации в XML в зависимости от типа, указанного внутри атрибута.

Код: Выделить всё

// inside a broader class
[System.Xml.Serialization.XmlElementAttribute("ReportRequest", typeof(ReportRequestType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, ElementName = "ReportRequest")]       [System.Xml.Serialization.XmlElementAttribute("StatusRequest", typeof(StatusRequestType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, ElementName = "StatusRequest")]
[System.Xml.Serialization.XmlElementAttribute("TransmitRequest", typeof(TransmitRequestType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, ElementName = "TransmitRequest")]
public object Item
{
get
{
return this.itemField;
}
set
{
this.itemField = value;
}
}
При сериализации с помощью newtonsoft свойство называется Item, где в XML это, например, TransmitRequest (если созданный тип является TransmitRequestType).
Я пытался использовать пользовательский JsonConverter, примененный к элементу, но в этом случае, похоже, я не могу получить доступ к атрибутам, чтобы определить имя, которое будет использоваться в зависимости от типа элемента.
Я попробовал ContractResolver, но затем я могу получить доступ к атрибуты, но, похоже, я не могу знать фактический тип, который будет использоваться.
Возможно, я что-то упускаю, но не знаю, что и где.
Я ожидаю, что что-то даст мне
От:

Код: Выделить всё

class A { public string Value {get;set;}}
class B { public int B1 {get; set;} public string B2 {get; set;}}

[attribute..., MyType=typeof(A), MyName="A"]
[attribute..., MyType=typeof(B), MyName="B"]
public object Item {get;set;}
Если я создаю объект, внутри которого Item имеет тип A, при сериализации я получаю (из атрибутов)

Код: Выделить всё

{
...
"A": {... content of class A},
...
}
Если я создаю объект, внутри которого Item имеет тип B, при сериализации я получаю (из атрибутов)

Код: Выделить всё

{
...
"B": {... content of class B},
...
}
Примечания:
  • Не верьте самим классам, типам и атрибутам... они являются всего лишь примерами для описания проблемы.
  • Мои настоящие типы имеют множество других свойств, к которым применяются атрибуты сериализации Json.NET, контролирующие их имена, игнорируются ли они и т. д. Распознаватель контрактов Json.NET по умолчанию учитывает это, поэтому мне бы хотелось избежать необходимости переделывать всю эту работу с нуля.


Подробнее здесь: https://stackoverflow.com/questions/799 ... name-based
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»