2

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

何か不足していますか、それともライブラリの問題ですか?

4

1 に答える 1

0

型のシリアル化をカスタマイズする必要がある場合に使用するカスタム コンバーターを定義できます。コンバーターはIYamlTypeConverterを実装し、Serializerまたはに登録する必要がありますDeserializer。このようなコンバーターの例を次に示します。

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()})

ここで完全に機能する例を見ることができます。

于 2014-10-13T22:35:04.173 に答える