diff --git a/Parallel/IpcParallel/Stream/EmitStreamAttribute.vb b/Parallel/IpcParallel/Stream/EmitStreamAttribute.vb new file mode 100644 index 0000000..5265a49 --- /dev/null +++ b/Parallel/IpcParallel/Stream/EmitStreamAttribute.vb @@ -0,0 +1,26 @@ +Imports System.IO + + +Public Class EmitStreamAttribute : Inherits Attribute + + Public ReadOnly Property Handler As Type + + Sub New(handler As Type) + Me.Handler = handler + End Sub + +End Class + +Public Interface IEmitStream + + ''' + ''' serialize into a memory stream buffer? + ''' + ''' + ''' + Function BufferInMemory(obj As Object) As Boolean + Function WriteBuffer(obj As Object, file As Stream) As Boolean + Function WriteBuffer(obj As Object) As Stream + Function ReadBuffer(file As Stream) As Object + +End Interface \ No newline at end of file diff --git a/Parallel/IpcParallel/Stream/StreamEmit.vb b/Parallel/IpcParallel/Stream/StreamEmit.vb index ee1d316..6a0477d 100644 --- a/Parallel/IpcParallel/Stream/StreamEmit.vb +++ b/Parallel/IpcParallel/Stream/StreamEmit.vb @@ -1,50 +1,53 @@ #Region "Microsoft.VisualBasic::e147992baf842713336a08ed275e0487, Parallel\IpcParallel\Stream\StreamEmit.vb" - ' Author: - ' - ' asuka (amethyst.asuka@gcmodeller.org) - ' xie (genetics@smrucc.org) - ' xieguigang (xie.guigang@live.com) - ' - ' Copyright (c) 2018 GPL3 Licensed - ' - ' - ' GNU GENERAL PUBLIC LICENSE (GPL3) - ' - ' - ' This program is free software: you can redistribute it and/or modify - ' it under the terms of the GNU General Public License as published by - ' the Free Software Foundation, either version 3 of the License, or - ' (at your option) any later version. - ' - ' This program is distributed in the hope that it will be useful, - ' but WITHOUT ANY WARRANTY; without even the implied warranty of - ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ' GNU General Public License for more details. - ' - ' You should have received a copy of the GNU General Public License - ' along with this program. If not, see . - - - - ' /********************************************************************************/ - - ' Summaries: - - ' Class StreamEmit - ' - ' Constructor: (+1 Overloads) Sub New - ' Function: (+2 Overloads) Emit, (+2 Overloads) handleCreate, handleSerialize - ' - ' - ' /********************************************************************************/ +' Author: +' +' asuka (amethyst.asuka@gcmodeller.org) +' xie (genetics@smrucc.org) +' xieguigang (xie.guigang@live.com) +' +' Copyright (c) 2018 GPL3 Licensed +' +' +' GNU GENERAL PUBLIC LICENSE (GPL3) +' +' +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. +' +' You should have received a copy of the GNU General Public License +' along with this program. If not, see . + + + +' /********************************************************************************/ + +' Summaries: + +' Class StreamEmit +' +' Constructor: (+1 Overloads) Sub New +' Function: (+2 Overloads) Emit, (+2 Overloads) handleCreate, handleSerialize +' +' +' /********************************************************************************/ #End Region Imports System.IO +Imports System.Reflection +Imports Microsoft.VisualBasic.Emit.Delegates +Imports Microsoft.VisualBasic.Linq Imports Microsoft.VisualBasic.MIME.application.json Imports Microsoft.VisualBasic.MIME.application.json.BSON -Imports Microsoft.VisualBasic.Scripting.MetaData +Imports TypeInfo = Microsoft.VisualBasic.Scripting.MetaData.TypeInfo Namespace IpcStream @@ -52,6 +55,7 @@ Namespace IpcStream ReadOnly toBuffers As New Dictionary(Of Type, toBuffer) ReadOnly loadBuffers As New Dictionary(Of Type, loadBuffer) + ReadOnly emitCache As New Dictionary(Of Type, IEmitStream) Sub New() For Each [handle] In EmitHandler.PopulatePrimitiveHandles @@ -82,8 +86,17 @@ Namespace IpcStream If emit = StreamMethods.Auto Then If loadBuffers.ContainsKey(type) Then Return loadBuffers(type)(buf) + ElseIf emitCache.ContainsKey(type) Then + Return emitCache(type).ReadBuffer(buf) Else - Return BSONFormat.Load(buf).CreateObject(type) + Dim handler As IEmitStream = getHandler(type) + + If Not handler Is Nothing Then + emitCache.Add(type, handler) + Return emitCache(type).ReadBuffer(buf) + Else + Return BSONFormat.Load(buf).CreateObject(type) + End If End If ElseIf emit = StreamMethods.BSON Then Return BSONFormat.Load(buf).CreateObject(type) @@ -94,17 +107,50 @@ Namespace IpcStream End If End Function + Private Function getHandler(type As Type) As IEmitStream + Dim attr As EmitStreamAttribute = CType(type, System.Reflection.TypeInfo).GetCustomAttributes(Of EmitStreamAttribute).FirstOrDefault + + If attr Is Nothing Then + Return Nothing + End If + + type = attr.Handler + + If Not type.ImplementInterface(Of IEmitStream) Then + Return Nothing + Else + Return Activator.CreateInstance(type) + End If + End Function + Public Function handleSerialize(param As Object) As ObjectStream Dim type As Type = param.GetType + Dim method As StreamMethods + Dim typeinfo As New TypeInfo(type, fullpath:=True) + Dim buf As Stream If toBuffers.ContainsKey(type) Then - Return New ObjectStream(New TypeInfo(type, fullpath:=True), StreamMethods.Emit, toBuffers(type)(param)) + method = StreamMethods.Emit + buf = toBuffers(type)(param) + ElseIf emitCache.ContainsKey(type) Then + method = StreamMethods.Auto + buf = emitCache(type).WriteBuffer(param) Else - Dim element = type.GetJsonElement(param, New JSONSerializerOptions) - Dim buf As Stream = BSONFormat.SafeGetBuffer(element) + Dim handler As IEmitStream = getHandler(type) - Return New ObjectStream(New TypeInfo(type, fullpath:=True), StreamMethods.BSON, buf) + If Not handler Is Nothing Then + emitCache.Add(type, handler) + method = StreamMethods.Auto + buf = handler.WriteBuffer(param) + Else + buf = type _ + .GetJsonElement(param, New JSONSerializerOptions) _ + .DoCall(AddressOf BSONFormat.SafeGetBuffer) + method = StreamMethods.BSON + End If End If + + Return New ObjectStream(typeinfo, method, buf) End Function End Class End Namespace diff --git a/Parallel/Parallel.vbproj b/Parallel/Parallel.vbproj index b5fc2f5..924bb7f 100644 --- a/Parallel/Parallel.vbproj +++ b/Parallel/Parallel.vbproj @@ -244,6 +244,7 @@ +