Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Objekt serialisieren (https://www.delphipraxis.net/153260-objekt-serialisieren.html)

Andreas L. 27. Jul 2010 11:30

Objekt serialisieren
 
Hallo,

ich möchte alle published-Eigenschaften eines Objekts in einer Client/Server-Anwendung vom Server zum Client schicken. Die Kommunikation erfolgt über IdHTTpServer (im Server) und IdHTTP (im Client). Die Daten !müssen! als String übertragen werden. Ich möchte mir den Aufwand ersparen alle Eigenschaften einzeln in ein eigenes Format (z. B. XML, INI, etc.) zu kopieren (derzeit über 50 Properties, zu viel Tipparbeit...). Also wollte ich die Komponente in einen Memory-Stream speichern, diesen mit TIdEncoderMIME in einen MIME-String kodieren und in einem StringStream abspeichern. Will ich den StringStream nun in einen TMemo ausgeben, bleibt das Feld leer. Eine Fehlermeldung erscheint nicht. Was mache ich falsch? Hat jemand vllt. eine elegantere Lösung dafür? Wichtig ist nur, dass es so einfach wie möglich zum umsetzen ist (ich habe keine Zeit 2 Wochen an einen Serialiszer zu arbeiten...). Schon mal vielen Dank :-D

Mein Test-Code:
Delphi-Quellcode:
type
  tmyobject = class(TComponent)
  private
    F1: String;
    f2: Int64;
  published
    property prop1: String read f1 write F1;
    property prop2: Int64 read f2 write f2;
  end;

...
...

procedure TForm7.Button1Click(Sender: TObject);
var
  obj: tmyobject;
  source: TMemoryStream;
  dest: TStringStream;
begin
  obj := tmyobject.Create(Self);
  obj.prop1 := 'Hallo, Welt!';
  obj.prop2 := 42;

  source := TMemoryStream.Create;
  source.WriteComponent(obj);

  dest := TStringStream.Create;

  IdEncoderMIME1.Encode(source, dest);

  memo1.Lines.LoadFromStream(dest);
end;
Grüße,
Andreas

mjustin 27. Jul 2010 12:12

AW: Objekt serialisieren
 
Für die Serialisierung benutzer ich meist open source Bibliotheken wie SuperObject oder OmniXML, diese können TPersistent nach JSON oder XML serialisieren (und zurück). Auch SimDesign NativeXML, das seit kurzem open source it, beherrscht dies.

shmia 27. Jul 2010 13:12

AW: Objekt serialisieren
 
Zitat:

Zitat von Andreas L. (Beitrag 1037846)
Will ich den StringStream nun in einen TMemo ausgeben, bleibt das Feld leer.

Vielleicht noch die Position im Stream auf Anfang setzen...
Delphi-Quellcode:
dest.Position := 0;

Andreas L. 27. Jul 2010 13:39

AW: Objekt serialisieren
 
Zitat:

Zitat von mjustin (Beitrag 1037857)
Für die Serialisierung benutzer ich meist open source Bibliotheken wie SuperObject oder OmniXML, diese können TPersistent nach JSON oder XML serialisieren (und zurück). Auch SimDesign NativeXML, das seit kurzem open source it, beherrscht dies.

Werde mir die Bibliotheken mal anschauen. Danke für die Links.

Zitat:

Zitat von shmia (Beitrag 1037873)
Zitat:

Zitat von Andreas L. (Beitrag 1037846)
Will ich den StringStream nun in einen TMemo ausgeben, bleibt das Feld leer.

Vielleicht noch die Position im Stream auf Anfang setzen...
Delphi-Quellcode:
dest.Position := 0;

Bringt leider auch nichts :-(

rollstuhlfahrer 27. Jul 2010 14:01

AW: Objekt serialisieren
 
und wie sieht es mit dem hauseigenen RTTI aus?

Bernhard

Blup 27. Jul 2010 14:51

AW: Objekt serialisieren
 
Einfach mal einen Breakpunkt setzen und die Datenobjekte untersuchen?
Delphi-Quellcode:
  {...}
  source.WriteComponent(obj);

  dest := TStringStream.Create;

  source.Position := 0; // <- hier Breakpunkt und source untersuchen
  IdEncoderMIME1.Encode(source, dest);

  dest.Position := 0; // <- hier Breakpunkt und dest untersuchen
  memo1.Lines.LoadFromStream(dest);


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz