我使用以下代码片段将项目的动态模型序列化为字符串(最终导出到 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 多行指南 https://yaml-multiline.info/,这里使用的格式是折叠块标量样式。有没有办法使用 YamlDotNet 将所有多行字符串属性的输出样式更改为文字块标量样式或流标量样式之一?
The YamlDotNet 文档 https://github.com/aaubry/YamlDotNet/wiki/Serialization.Serializer演示如何使用 WithAttributeOverride 将 ScalarStyle.DoubleQuoted 应用于特定属性,但这需要类名并且要序列化的模型是动态的。这还需要列出每个要更改的属性(其中有很多)。我想立即更改所有多行字符串属性的样式。
为了回答我自己的问题,我现在已经弄清楚如何通过派生来做到这一点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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)