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