Измените скалярный стиль, используемый для всех многострочных строк, при сериализации динамической модели с использованием YamlDotNet - PullRequest
0 голосов
/ 17 октября 2019

Я использую следующий фрагмент кода для сериализации динамической модели проекта в строку (которая в конечном итоге экспортируется в файл YAML).

    dynamic exportModel = exportModelConvertor.ToDynamicModel(project);
    var serializerBuilder = new SerializerBuilder();
    var serializer = serializerBuilder.EmitDefaults().DisableAliases().Build();

    using (var sw = new StringWriter())
    {
        serializer.Serialize(sw, exportModel);
        string result = sw.ToString();
    }

Любые многострочные строки, такие как следующие:

propertyName = "One line of text
followed by another line
and another line"

экспортируются в следующем формате:

propertyName: >
  One line of text

  followed by another line

  and another line

Обратите внимание на дополнительные (нежелательные) разрывы строк.

В соответствии с этим Многострочное руководство YAML, используемый здесь формат - скалярный стиль сложенного блока. Есть ли способ использовать YamlDotNet для изменения стиля этого вывода для всех свойств многострочных строк на скалярный стиль литерального блока или один из скалярных стилей потока?

В документации YamlDotNet показано, как применять ScalarStyle.DoubleQuoted к определенному свойству с помощью WithAttributeOverride, но для этого требуется имя класса, а модель для сериализации - динамическая. Это также требует перечисления каждого свойства для изменения (из которых есть много). Я хотел бы изменить стиль для всех свойств многострочных строк сразу.

1 Ответ

0 голосов
/ 31 октября 2019

Чтобы ответить на мой собственный вопрос, я теперь решил, как это сделать, выведя из класса ChainedEventEmitter и переопределив void Emit(ScalarEventInfo eventInfo, IEmitter emitter). См. Пример кода ниже.

public class MultilineScalarFlowStyleEmitter : ChainedEventEmitter
{
    public MultilineScalarFlowStyleEmitter(IEventEmitter nextEmitter)
        : base(nextEmitter) { }

    public override void Emit(ScalarEventInfo eventInfo, IEmitter emitter)
    {

        if (typeof(string).IsAssignableFrom(eventInfo.Source.Type))
        {
            string value = eventInfo.Source.Value as string;
            if (!string.IsNullOrEmpty(value))
            {
                bool isMultiLine = value.IndexOfAny(new char[] { '\r', '\n', '\x85', '\x2028', '\x2029' }) >= 0;
                if (isMultiLine)
                    eventInfo = new ScalarEventInfo(eventInfo.Source)
                    {
                        Style = ScalarStyle.Literal
                    };
            }
        }

        nextEmitter.Emit(eventInfo, emitter);
    }
}
...