使用YamlDotNet序列化动态模型时,更改用于所有多行字符串的标量样式

使用YamlDotNet序列化动态模型时,更改用于所有多行字符串的标量样式,yaml,yamldotnet,Yaml,Yamldotnet,我使用以下代码片段将项目的动态模型序列化为字符串(最终导出为YAML文件) dynamicexportmodel=exportModelConvertor.ToDynamicModel(项目); var serializerBuilder=new serializerBuilder(); var serializer=serializerBuilder.EmitDefaults().DisableAliases().Build(); 使用(var sw=new StringWriter()) {

我使用以下代码片段将项目的动态模型序列化为字符串(最终导出为YAML文件)

dynamicexportmodel=exportModelConvertor.ToDynamicModel(项目);
var serializerBuilder=new serializerBuilder();
var serializer=serializerBuilder.EmitDefaults().DisableAliases().Build();
使用(var sw=new StringWriter())
{
serializer.Serialize(软件、导出模型);
字符串结果=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
注意额外的(不需要的)换行符

据此,这里使用的格式是折叠块标量样式。是否有办法使用YamlDotNet将所有多行字符串属性的输出样式更改为文字块标量样式或流标量样式之一


显示了如何使用WithAttributeOverride将ScalarStyle.DoubleQuoted应用于特定属性,但这需要一个类名,并且要序列化的模型是动态的。这还需要列出要更改的每个属性(其中有许多属性)。我想一次更改所有多行字符串属性的样式。

为了回答我自己的问题,我现在通过从
chainedEventMitter
类派生并重写
void Emit(ScalarEventInfo,IEmitter emitter)
解决了如何做到这一点。请参阅下面的代码示例

公共类MultileScalarFlowStyleEmitter:ChainedEventEmitter
{
公共多重CalarFlowStyleEmitter(IEventMitter-nextEmitter)
:base(nextEmitter){}
公共覆盖无效发射(ScalarEventInfo事件信息,IEmitter发射器)
{
if(typeof(string).IsAssignableFrom(eventInfo.Source.Type))
{
字符串值=eventInfo.Source.value作为字符串;
如果(!string.IsNullOrEmpty(值))
{
bool isMultiLine=value.IndexOfAny(新字符[]{'\r','\n','\x85','\x2028','\x2029'})>=0;
如果(isMultiLine)
eventInfo=新的ScalarEventInfo(eventInfo.Source)
{
Style=ScalarStyle.Literal
};
}
}
Emit(eventInfo,emitter);
}
}

与SerializerBuilder一起使用的注意事项:
builder.WithEventEmitter(nextItemitter=>new MultileScalarFlowStyleEmitter(nextItemitter))