前回公開した独自シリアライズはネイティブ以外の型は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