【问题标题】:YamlDotNet - Serialization of Guid properties generates empty bracketsYamlDotNet - Guid 属性的序列化生成空括号
【发布时间】:2014-09-17 10:26:59
【问题描述】:

我正在使用 YamlDotNet 库来序列化 Yaml 中的一些对象。我在 Guid 属性的序列化方面遇到了一些问题。 Guid 属性的序列化生成空括号(例如:{})

见下方代码

Dim l As New List(Of Person)
l.Add(New Person() With {.Firstname = "MyFirstName", .Lastname = "MyLastName", .Id = Guid.NewGuid()})

Using sw As New StreamWriter("output.yaml", False)
    Dim serializer = New Serializer()
    serializer.Serialize(sw, l)
End Using

这段代码将输出:

- Id: {}
  Firstname: MyFirstName
  Lastname: MyLastName

跟班:

Public Class Person
    Public Property Id As Guid
    Public Property Frstname As String
    Public Property Lastname As String
End Class

是我遗漏了什么还是图书馆的问题?

【问题讨论】:

  • 库问题不会为 YAML 中不支持的类型抛出异常。
  • 所以 YamlDotNet 序列化/反序列化不支持 Guid 类型?我期待库输出类似 {1234564-1232132-21321321} 的东西,然后这个字符串可以很容易地解析为 system.guid ...
  • Guid 类型本身不支持,但添加支持很简单。看我的回答。

标签: vb.net yaml yamldotnet


【解决方案1】:

您可以定义一个自定义转换器,以便在需要自定义类型的序列化时使用。转换器需要实现IYamlTypeConverter,并在SerializerDeserializer上注册。以下是此类转换器的示例:

Public Class GuidConverter
    Implements IYamlTypeConverter

    Public Function Accepts(type As Type) As Boolean Implements IYamlTypeConverter.Accepts
        Return type = GetType(Guid)
    End Function

    Public Function ReadYaml(parser As IParser, type As Type) As Object Implements IYamlTypeConverter.ReadYaml
        Dim reader = New EventReader(parser)
        Dim scalar = reader.Expect(Of Scalar)()
        Return Guid.Parse(scalar.Value)
    End Function

    Public Sub WriteYaml(emitter As IEmitter, value As Object, type As Type) Implements IYamlTypeConverter.WriteYaml
        emitter.Emit(New Scalar(value.ToString()))
    End Sub
End Class

用法很简单:

Dim serializer = New Serializer()
serializer.RegisterTypeConverter(New GuidConverter())
serializer.Serialize(Console.Out, New With {.id = Guid.NewGuid()})

你可以看到fully working example here

【讨论】:

  • 这个例子的反序列化如何工作?尝试将输出 id: eff34230-ed6c-4c88-aaba-6f6a177c733c 反序列化回 Guid 会引发异常:dotnetfiddle.net/exp9su
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多