C# YamlDotNet-自定义序列化

C# YamlDotNet-自定义序列化,c#,.net,yaml,yamldotnet,C#,.net,Yaml,Yamldotnet,我有一个.NET类,它表示RPC方法调用,如下所示: class方法调用 { 公共字符串MethodName{get;set;} 公共集合参数{get;set;} } 我想将集合序列化为YAML。我正在使用YamlDotNet来实现这一点 默认情况下,YamlDotNet将按如下方式序列化这些对象: methodName:someName 论据: -arg1 -arg2 - ... 我想将结果YAML简化为: someName: -arg1 -arg2 有什么简单的方法可以做到这一点吗?请

我有一个.NET类,它表示RPC方法调用,如下所示:

class方法调用
{
公共字符串MethodName{get;set;}
公共集合参数{get;set;}
}
我想将
集合
序列化为YAML。我正在使用YamlDotNet来实现这一点

默认情况下,YamlDotNet将按如下方式序列化这些对象:

methodName:someName
论据:
-arg1
-arg2
- ...
我想将结果YAML简化为:

someName:
-arg1
-arg2

有什么简单的方法可以做到这一点吗?请注意,参数可以是复杂对象(即,不是简单的标量)。

您可以通过注册执行所需转换的
IYamlTypeConverter
实现这一点

下面是一个可能的实现:

公共密封类MethodCallConverter:IYamlTypeConverter
{
//不幸的是,API没有提供ReadYaml和WriteYaml中的那些
//方法,因此我们必须在创建后设置它们。
公共IValueSerializer ValueSerializer{get;set;}
public ivlueDeserializer ValueDeserializer{get;set;}
公共bool接受(Type Type)=>Type==typeof(MethodCall);
公共对象ReadYaml(IParser解析器,类型)
{
Consume();
var call=newmethodcall
{
MethodName=(string)ValueDeserializer.DeserializeValue(解析器、typeof(string)、new SerializerState()、ValueDeserializer),
参数=(集合)ValueDeserializer.DeserializeValue(解析器、typeof(集合)、new SerializerState()、ValueDeserializer),
};
Consume();
回电;
}
public void WriteYaml(IEmiter发射器、对象值、类型)
{
Emit(新的MappingStart());
var call=(MethodCall)值;
serializer.SerializeValue(发射器,call.MethodName,typeof(字符串));
serializer.SerializeValue(发射器、调用.参数、类型(集合));
Emit(新的MappingEnd());
}
}
转换器需要通过
WithTypeConverter
方法注册到
SerializerBuilder
DeserializerBuilder
。请注意,YamlDotNet并没有为我们提供递归调用(反)序列化程序的方法,因此我们必须设置一些公共属性作为解决方法。这并不像可能的那么干净,但仍然有效:

string序列化方法调用(方法调用)
{
var methodCallConverter=new methodCallConverter();
var serializerBuilder=new serializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.带类型转换器(methodCallConverter);
methodCallConverter.ValueSerializer=serializerBuilder.BuildValueSerializer();
var serializer=serializerBuilder.Build();
var yaml=serializer.Serialize(调用);
返回yaml;
}
MethodCall反序列化MethodCall(字符串yaml)
{
var methodCallConverter=new methodCallConverter();
var deserializerBuilder=新的deserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.带类型转换器(methodCallConverter);
methodCallConverter.ValueDeserializer=deserializerBuilder.BuildValueDeserializer();
var deserializer=deserializerBuilder.Build();
var call=反序列化器。反序列化(yaml);
回电;
}

上面的公共集合参数{get;set;}添加以下内容:[XmlElement()]您有一个数组,Net会自动为数组添加两个标记。使用元素只会添加一个标记。是否仍有方法覆盖内置类型的序列化方式?例如,我有几个整数,我想把它们写成十六进制字符串,而不是整数。看起来我可以使用
IYamlTypeConverter
来重写该行为,但是它将应用于所有int,而不是我想要写为hex的特定属性。目前无法确定要序列化的属性,只有类型。