独自シリアライズ2(.net)

前回公開した独自シリアライズはネイティブ以外の型はDataContractでシリアライズ可能にしておかなければならない。
これは少々まずい。
既存の型をシリアライズできないからだ。
このあたりを改善してみた。
非DataContract且つ非ネイティブ型はコールバックで対応する。
Byson.BysonStorageの仮想関数がこれだ。

下記はBysonStorageの派生クラスでSystem.Drawing.SizeFをシリアライズする例。

Public Class MyStorage
  Inherits Byson.BysonStorage
  Public Sub New()
    MyBase.new(
      777777777L,
      System.Reflection.Assembly.GetExecutingAssembly())
  End Sub
  Protected Overrides Sub ExternalWrite(
            ByVal stream As System.IO.Stream,
            ByVal map As Byson.BysonMap, ByVal o As Object)
    If o.GetType().Equals(GetType(SizeF)) Then
      Byson.ByBlock.WriteSingle(stream, CType(o, SizeF).Width)
      Byson.ByBlock.WriteSingle(stream, CType(o, SizeF).Height)
    End If
  End Sub
  Protected Overrides Function ExternalRead(
            ByVal stream As System.IO.Stream,
            ByVal map As Byson.BysonMap,
            ByVal typename As String) As Object
    Dim ret As Object = Nothing
    If typename.Equals(GetType(SizeF).FullName) Then
      Dim sz As SizeF
      sz.Width = Byson.ByBlock.ReadSingle(stream)
      sz.Height = Byson.ByBlock.ReadSingle(stream)
      ret = sz
    End If
    Return ret
  End Function
End Class

サンプル付きプロジェクトはこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です