Kompletter Type (Klasse) Speichern und Laden

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Kompletter Type (Klasse) Speichern und Laden

BeitragDi, Jul 14, 2020 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
wer schon immer einen kompletten type speichern und oder laden wollte hat nun die möglichkeit dazu, auch ein objekt kopieren ist möglich.

ihr legt im ordner BRL.mod einen "tdata.mod" an speichert das modul darein als tdata.bmx fertig

nun gehen wir in brl.mod/stream.mod

dort sind nämlich 2 befehle die niemals von mark.s fertig gestellt wurde
un genau das wird gelöscht dann gespeichert!
Code: [AUSKLAPPEN]
Function LoadObject:Object( url:Object )
   Local stream:TStream=ReadStream( url )
   If Not stream Throw New TStreamReadException
   Local obj:Object=stream.ReadObject()
   stream.Close
   Return obj
End Function

Function SaveObject( obj:Object,url:Object )
   Local stream:TStream=WriteStream( url )
   If Not stream Throw New TStreamWriteException
   stream.WriteObject obj
   stream.Close
End Function




nun wird des neu compiliert und fertig!

example _ 1 (Das Speichern)
Code: [AUSKLAPPEN]
SuperStrict
Import brl.TData

Type TEinheit
   Field Name:String
   Field Leben:Float
   Field Schild:Float
End Type


Local E:TEinheit = New TEinheit
E.Name = "Test"
E.Leben = 400
E.Schild = 200

SaveObject(E, "Test.txt")



example _ 2(Das Laden)
Code: [AUSKLAPPEN]
SuperStrict
Import brl.TData

Type TEinheit
   Field Name:String
   Field Leben:Float
   Field Schild:Float
End Type

Local E:TEinheit = TEinheit(LoadObject("Test.txt"))
Print E.Name
Print e.Leben
Print e.Schild




Was geht nicht Question
verlinkungen bzw vererbungen eine liste in einem type wird nicht funktionieren, leider
BSP
Code: [AUSKLAPPEN]
Type TEinheit
   Field Name:String
   Field Leben:Float
   Field Schild:Float
   Field List:TList
End Type


Local E:TEinheit = New TEinheit
E.Name = "Test"
E.Leben = 400
E.Schild = 200
E.List = New TList
Local A:TEinheit = New TEinheit
A.Name = "LOL"
A.Leben = 90
A.Schild = 1
E.List.AddLast A




Exclamation Wichtig das modul ist nicht von mir meines wissens nach ist der welcher unbekannt
Hier das MODUL
Code: [AUSKLAPPEN]
SuperStrict

Rem
bbdoc: 0==K5
End Rem
Module brl.TData

ModuleInfo "1.0"


Import brl.blitz      ' import BlitzMax
Import brl.stream     ' import TStream class
Import brl.reflection ' import Objects reflection

Public

Rem
bbdoc: 1L5:B 40==KE
End Rem
Type TData Abstract
   Method New()
      TObjectStream._datas:+[Self]
   End Method
   
   Rem
   bbdoc: "M3"
   End Rem
   Method ToString:String() Abstract
   
   Rem
   bbdoc: $C=:F8O GB5=8O >1L5:B0
   End Rem
   Method ReadObject:Object(stream:TStream) Abstract
   
   Rem
   bbdoc: $C=:F8O 70?8A8 >1L5:B0
   End Rem
   Method WriteObject(obj:Object, stream:TStream) Abstract
End Type

Rem
bbdoc: 1L5:B 40==KE
End Rem
Function CreateObjectStream:TStream(stream:TStream)
   Return New TObjectStream.Create(stream)
End Function

Rem
bbdoc: Laden vom gesamten objekt
End Rem
Function LoadObject:Object(url:Object)
   Local stream:TStream = TStream(url)
   If Not stream Then stream = ReadStream(url)
   Return CreateObjectStream(stream).ReadObject()   
End Function

Rem
bbdoc: Speichert ein gesamtes objekt
End Rem
Function SaveObject(obj:Object, url:Object)
   Local stream:TStream = TStream(url)
   If Not stream Then stream = WriteStream(url)
   CreateObjectStream(stream).WriteObject(obj)
End Function

Function CopyObject:Object(obj:Object, tid:TTypeId = Null)
   
   If Not tid
      tid:TTypeId = TTypeId.ForObject(obj)
   End If
   
   If tid.MetaData("no_copy") Then Return tid.NewObject()
   
   Select tid ' awesome!
   Case ByteTypeId, ShortTypeId, IntTypeId, LongTypeId, FloatTypeId, DoubleTypeId, StringTypeId
      Return String(obj)
   End Select
   
   Local copy:Object
   
   If tid.Name().EndsWith("]") 'ElementType() ' array
      
      copy = tid.NewArray(tid.ArrayLength(obj)) ' 1d array
      
      
      
      Return copy
      
   End If
   
   copy = tid.NewObject()
   
   For Local f:TField = EachIn tid.EnumFields()
   
      If f.MetaData("no_copy") Then Continue
      
      Local etid:TTypeId = TTypeId.ForName(f.TypeId().Name())
      
      Select etid
      Case ByteTypeId, ShortTypeId, IntTypeId
         f.SetInt(copy, f.GetInt(obj))
      Case LongTypeId
         f.SetLong(copy, f.GetLong(obj))
      Case FloatTypeId
         f.SetFloat(copy, f.GetFloat(obj))
      Case DoubleTypeId
         f.SetDouble(copy, f.GetDouble(obj))
      Case StringTypeId
         f.SetString(copy, f.GetString(obj))
      Default
         f.Set(copy, CopyObject(f.Get(obj), etid))
      End Select
      
   Next
   
   Return copy
   
End Function

Private

Rem   
    ------OBJECT-STREAMS------
   | PROTOCOL   : "object"  |
   | NOSAVE TAG : "no_save" |
    --------------------------
   
   -------------------------READING--------------------------
   | Local stream:TStream = ReadStream("object::file.txt")  |
   | Local obj:Object = stream.ReadObject()                 |
   ----------------------------------------------------------
   
   -------------------------WRITEING-------------------------
   | Local stream:TStream = WriteStream("object::file.txt") |
   | stream.WriteObject(obj)                                |
   ----------------------------------------------------------
EndRem

Type TObjectStream Extends TStreamWrapper
   Global _datas:TData[]
   Global _tid:TTypeId = Null
   
   Method Close()
      _stream.Close()
      SetStream(Null)
   End Method
   
   Method Delete()
      If _stream Then Close()
   End Method
   
   Method Create:TStream(stream:TStream)
      SetStream(stream)
      Return Self
   End Method
   
   Method ClearArrayName:String(name:String)
      Return name[..name.FindLast("[")]
   End Method
   
   Method DataTypeId:TData(tid:TTypeId)
      Local tags:String[], i:Int
      For Local data:TData = EachIn _datas
         tags = data.ToString().Split(" ")
         If tid.Name().ToLower() <> tags[0].ToLower() Then Continue
         For i = 1 Until tags.Length
            If Not tid.MetaData(tags[i])
               i = 0
               Exit
            End If
         Next
         If i = 0 Then Continue
         Return data
      Next
   End Method
   
   Rem
   Method WriteCString:Int(str:String)
      Return Write(str + "~0", str.Length + 1)
   End Method
   
   Method ReadCString:String()
      Local mem:Byte Ptr = MemAlloc(Size() - pos())
      Local i:Int
      While Not Eof()
         mem[i] = ReadByte()
         If mem[i] = 0 Then Exit
         i:+1
      Wend
      Local str:String = String.FromCString(mem)
      MemFree(mem)
      Return str
   End Method
   end rem
   
   '--------------------------------------------------------------------------------------------------------------
   
   Method ReadObject:Object()
      Select ReadByte()
         Case 59 Return Null
         Case 123
         Default Throw New TStreamReadException
      End Select
   
      Local tid:TTypeId = ReadTypeId()
      
      Local obj:Object = ReadSingle(tid)
      If obj Then Return obj
      
      If tid.MetaData("no_save") Then Return tid.NewObject()
      
      obj = ReadArray(tid)
      If obj Then Return obj
      
      obj = ReadFromData(tid)
      If obj Then Return obj
      
      Return ReadFields(tid)
   End Method
   
   Method ReadTypeId:TTypeId()
      Local mem:Byte Ptr = MemAlloc(Size() - pos())
      Local i:Int
      While Not Eof()
         mem[i] = ReadByte()
         If mem[i] = 125
            mem[i] = 0
            Exit
         End If
         i:+1
      Wend
      Local name:String = String.FromCString(mem)
      MemFree(mem)
?Debug
      Local t:TTypeId = TTypeId.ForName(name)
      If Not t Then WriteStdout("WARNING! Type id not created -> " + name + "~n")
      Return t
?
      Return TTypeId.ForName(name)
   End Method
   
   Method ReadSingle:Object(tid:TTypeId)
      Select tid
      Case ByteTypeId Return String.FromInt(ReadByte())
      Case ShortTypeId Return String.FromInt(ReadShort())
      Case IntTypeId Return String.FromInt(ReadInt())
      Case LongTypeId Return String.FromLong(ReadLong())
      Case FloatTypeId Return String.FromFloat(ReadFloat())
      Case DoubleTypeId Return String.FromDouble(ReadDouble())
      Case StringTypeId Return ReadString(ReadInt())
      End Select
   End Method
   
   Method ReadArray:Object(tid:TTypeId)
   
      If tid.ElementType()
      
         Local dims:Int = ReadInt()
         Local array:Int[] = New Int[dims]
         Local ln:Int
         For Local i:Int = 0 Until dims
            array[i] = ReadInt()
            If i = 0
               ln = array[i]
            Else
               array[i + ~0] :/array[i]
            End If
         Next
         Local obj:Object = tid.NewArray(ln, array)
         Local etid:TTypeId = TTypeId.ForName(ClearArrayName(tid.Name()))
         For Local pos:Int = 0 Until ln
            Select etid
               Case ByteTypeId tid.SetArrayElement(obj, pos, Object(String(ReadByte())))
               Case ShortTypeId tid.SetArrayElement(obj, pos, Object(String(ReadShort())))
               Case IntTypeId tid.SetArrayElement(obj, pos, Object(String(ReadInt())))
               Case LongTypeId tid.SetArrayElement(obj, pos, Object(String(ReadLong())))
               Case FloatTypeId tid.SetArrayElement(obj, pos, Object(String(ReadFloat())))
               Case DoubleTypeId tid.SetArrayElement(obj, pos, Object(String(ReadDouble())))
               Case StringTypeId tid.SetArrayElement(obj, pos, Object(ReadString(ReadInt())))
               Default tid.SetArrayElement(obj, pos, ReadObject())
            End Select
         Next
         Return obj
      End If
   End Method
   
   Method ReadFromData:Object(tid:TTypeId)
      Local data:TData = DataTypeId(tid)
      If data Then Return data.ReadObject(Self)
   End Method
   
   Method ReadFields:Object(tid:TTypeId)
      Local obj:Object = tid.NewObject()
      For Local f:TField = EachIn tid.EnumFields()
         If f.MetaData("no_save") Then Continue
         Local etid:TTypeId = TTypeId.ForName(f.TypeId().Name())
         'DebugLog "Reading field : " + etid.Name()
         Select etid
            Case ByteTypeId f.SetInt(obj, ReadByte())
            Case ShortTypeId f.SetInt(obj, ReadShort())
            Case IntTypeId f.SetInt(obj, ReadInt())
            Case LongTypeId f.SetLong(obj, ReadLong())
            Case FloatTypeId f.SetFloat(obj, ReadFloat())
            Case DoubleTypeId f.SetDouble(obj, ReadDouble())
            Case StringTypeId f.SetString(obj, ReadString(ReadInt()))
            Default f.Set(obj, ReadObject())
         End Select
      Next
      Return obj
   End Method
   
   '--------------------------------------------------------------------------------------------------------------
   
   Method WriteObject:Int(obj:Object)
      If obj = Null
         WriteByte(59)
         _tid = Null
         Return False
      End If
      WriteByte(123)
      
      Local tid:TTypeId = _tid
      _tid = Null
      If tid = ObjectTypeId Then tid = TTypeId.ForObject(obj)
      If Not tid Then tid = TTypeId.ForObject(obj)
      
      DebugLog "TID = " + tid.Name()
      
      If Not WriteTypeId(tid) Then Return False
      
      If WriteSingle(tid, obj) Then Return True
      
      If tid.MetaData("no_save") Then Return True
      
      If WriteArray(tid, obj) Then Return True
      
      If WriteData(tid, obj) Then Return True
      
      Return WriteFields(tid, obj)
   End Method
   
   Method WriteTypeId:Byte(tid:TTypeId)
      'DebugLog "Writing : " + tid.Name()
      Local name:String = tid.Name() + "}"
      Return WriteBytes(name, name.Length) = name.Length
   End Method
   
   Method WriteSingle:Byte(tid:TTypeId, obj:Object)
      Select tid
         Case ByteTypeId WriteByte(Byte(obj.ToString())) ; Return True
         Case ShortTypeId WriteShort(Short(obj.ToString())) ; Return True
         Case IntTypeId WriteInt(Int(obj.ToString())) ; Return True
         Case LongTypeId WriteLong(Long(obj.ToString())) ; Return True
         Case FloatTypeId WriteFloat(Float(obj.ToString())) ; Return True
         Case DoubleTypeId WriteDouble(Double(obj.ToString())) ; Return True
         Case StringTypeId
            WriteInt(obj.ToString().Length)
            WriteString(obj.ToString())
            Return True
      End Select
   End Method
   
   Method WriteArray:Byte(tid:TTypeId, obj:Object)
      If tid.Name().EndsWith("]")
         DebugLog "Array : " + tid.Name()
         Local etid:TTypeId = TTypeId.ForName(ClearArrayName(tid.Name()))
         WriteInt(tid.ArrayDimensions(obj))
         DebugLog "Array Dims : " + tid.ArrayDimensions(obj)
         For Local i:Int = 0 Until tid.ArrayDimensions(obj)
            WriteInt(tid.ArrayLength(obj, i))
            DebugLog "Array DIM Length : " + tid.ArrayLength(obj, i)
         Next
         DebugLog "Array FULL LENGTH : " + tid.ArrayLength(obj)
         
         For Local pos:Int = 0 Until tid.ArrayLength(obj)
            Select etid
               Case ByteTypeId WriteByte(tid.GetArrayElement(obj, pos).ToString().ToInt())
               Case ShortTypeId WriteShort(tid.GetArrayElement(obj, pos).ToString().ToInt())
               Case IntTypeId WriteInt(tid.GetArrayElement(obj, pos).ToString().ToInt())
               Case LongTypeId WriteLong(tid.GetArrayElement(obj, pos).ToString().ToLong())
               Case FloatTypeId WriteFloat(tid.GetArrayElement(obj, pos).ToString().ToFloat())
               Case DoubleTypeId WriteDouble(tid.GetArrayElement(obj, pos).ToString().ToDouble())
               Case StringTypeId
                  WriteInt(tid.GetArrayElement(obj, pos).ToString().Length)
                  WriteString(tid.GetArrayElement(obj, pos).ToString())
               Default
                  _tid = Null
                  WriteObject(tid.GetArrayElement(obj, pos))
            End Select
         Next
         Return True
      End If
   End Method
   
   Method WriteData:Byte(tid:TTypeId, obj:Object)
      Local data:TData = DataTypeId(tid)
      If data
         data.WriteObject(obj, Self)
         Return True
      End If
   End Method
   
   Method WriteFields:Byte(tid:TTypeId, obj:Object)
      For Local f:TField = EachIn tid.EnumFields()
         If f.MetaData("no_save") Then Continue
         Local etid:TTypeId = f.TypeId()
         'DebugLog "Write field : " + etid.Name()
         Select etid
            Case ByteTypeId WriteByte(f.GetInt(obj))
            Case ShortTypeId WriteShort(f.GetInt(obj))
            Case IntTypeId WriteInt(f.GetInt(obj))
            Case LongTypeId WriteLong(f.GetLong(obj))
            Case FloatTypeId WriteFloat(f.GetFloat(obj))
            Case DoubleTypeId WriteDouble(f.GetDouble(obj))
            Case StringTypeId
               WriteInt(f.GetString(obj).Length)
               WriteString(f.GetString(obj))
            Default
               _tid = etid
               WriteObject(f.Get(obj))
         End Select
      Next
      Return True
   End Method
End Type

Type TObjectStreamFactory Extends TStreamFactory
   Method CreateStream:TStream(url:Object, proto:String, path:String, readable:Int, writeable:Int)
      If proto = "object" Then
         Local stream:TStream = OpenStream(path, readable, writeable)
         If stream Then Return New TObjectStream.Create(stream)
      End If
   End Method
End Type

Function Free()
   TObjectStream._datas = Null
   TObjectStream._tid = Null
End Function

Function install()
   New TObjectStreamFactory
   OnEnd(Free)
End Function

install()
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragFr, Jul 17, 2020 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool! Ich glaube BlitzMax fehlen generell Module zum Objekte serialisieren/deserialisieren (im Vergleich mit anderen Sprachen), aber ich denke in BlitzMax-ng gibt es da ein paar Alternativen.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group