Получить текущий контекст из десериализатора узлаC#

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

Сообщение Anonymous »

Я пытаюсь написать десериализатор, способный принимать событие обычно несовместимого типа и десериализовать его до ожидаемого типа. Однако я хочу, чтобы это было добровольно, поэтому к десериализуемому свойству должен быть применен определенный атрибут. Я могу сделать это с помощью сериализаторов довольно легко, поскольку он предоставляет дескриптор свойства для сериализуемого свойства, но не знаю, как это сделать из десериализатора.
это работает:
public class MySerializer(IObjectGraphVisitor nextVisitor) : ChainedObjectGraphVisitor(nextVisitor)
{
public override bool Enter(IPropertyDescriptor? propertyDescriptor, IObjectDescriptor value, IEmitter context, ObjectSerializer serializer)
{
if (value.Value is not null
&& propertyDescriptor?.GetCustomAttribute() is not null // can lookup attribute here
&& /* other checks */)
{
// serialize it
}
return base.Enter(propertyDescriptor, value, context, serializer);
}
}

не знаю, как получить доступ отсюда:
public class MyDeserializer(INodeDeserializer wrapped) : INodeDeserializer
{
public bool Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value, ObjectDeserializer rootDeserializer)
{
if (reader.Current is MappingStart)
{
// how do I even access the property from here?
// none of the parameters provides the context
}
return wrapped.Deserialize(reader, expectedType, nestedObjectDeserializer, out value, rootDeserializer);
}
}

Мой конкретный случай — сопоставление значений из файла yaml для переменных среды. Сопоставленный тип представляет собой массив строк, хранящихся в виде пар «=». Но мне нужно, чтобы он был достаточно гибким, чтобы принимать сопоставления значений, а не только последовательностей.
[YamlSerializable]
public class ServiceConfig
{
[YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitNull | DefaultValuesHandling.OmitEmptyCollections)]
[MaybeFromMapping] // add this to opt-in
public string[]? Environment { get; set; }
}

# must support this
environment:
- key1=value1
- key2=value2
- key3=value3

---

# but also this
environment:
key4: value4
key5: value5
key6: value6


Подробнее здесь: https://stackoverflow.com/questions/798 ... serializer
Ответить

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

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

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

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

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