Kompletter Type (Klasse) Speichern und Laden
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Mathias-KwiatkowskiBetreff: Kompletter Type (Klasse) Speichern und Laden |
Di, Jul 14, 2020 19:23 Antworten mit Zitat |
|
---|---|---|
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 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 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 |
Fr, Jul 17, 2020 20:43 Antworten mit Zitat |
|
---|---|---|
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 |
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group