AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language TStringStream - ein Bug oder was mache ich falsch?
Thema durchsuchen
Ansicht
Themen-Optionen

TStringStream - ein Bug oder was mache ich falsch?

Ein Thema von Elrond · begonnen am 4. Jun 2018 · letzter Beitrag vom 4. Jun 2018
Antwort Antwort
Elrond

Registriert seit: 29. Sep 2014
71 Beiträge
 
#1

TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 09:22
Delphi-Version: 10.2 Tokyo
Hallo Zusammen,

der TStringStream arbeitet nicht wie erwartet. Wenn ich auf den gespeicherten String via DataString zugreifen möchte, fehlt einfach ein Großteil des Strings. Das gleiche wenn ich den String direkt in eine Textdatei speichern möchte. Der direkte Zugriff über den Bytestream klappt dagegen (macht das Framework). Ich habe schon unterschiedliche Encodings probiert, keine Abhilfe, auch hat der zurückgegebene String keine Encodingprobleme, er bricht einfach nach knapp 36T Zeichen ab.

Der betreffende Quelltext:

Code:

function TOcServiceDocumentServerModule.GetSwagger(URLEncoding:Boolean): TStream;
var
  Doc: TOpenApiDocument;
  Builder: TOcOpenApiBuilder;
  Writer: TJsonWriter;
  Serializer: TSerializer;
  resultStr: String;

begin
  Builder := TOcOpenApiBuilder.Create((Module as TOcXDataServerModule).XModel);
  Doc := Builder.GetDocument;
 
  try
    Writer := nil;
    Serializer := nil;
    Result := TStringStream.Create;
 // Result := TFileStream.Create('bla.txt', fmCreate);
    try
      Writer := TJsonWriter.Create(Result);
      Serializer := TSerializer.Create;
      Serializer.Write(Doc, Writer);

     //(Result as TStringStream).SaveToFile('bla.txt');
      
   if URLEncoding then begin
      resultStr := (Result as TStringStream).DataString;
       resultStr := StringReplace(resultStr, '<', '%3C', [rfIgnoreCase]);
       resultStr := StringReplace(resultStr, '>', '%3E', [rfIgnoreCase]);
       Result := TStringStream.Create(resultStr);
   end;
    except
      FreeAndNil(Result);
      raise;
    end;
  finally
    Serializer.Free;
    Writer.Free;
  end;
end;
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#2

AW: TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 09:56
Versuch mal im TStringStream.Create( LString ); eine Arbeitsvariable anzugeben
http://docwiki.embarcadero.com/CodeE...tring_(Delphi)

Rollo
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 10:07
Ohne genaue Kenntnis von TOpenApiDocument, TOcOpenApiBuilder, TJsonWriter (ist nicht der Delphi eigene) und TSerializer ist es schwierig dir da weiterzuhelfen.
Aber ein Hinweis: Wenn URLEncoding == true ist, dann überschreibst du das Result und hast ein Speicherleck vom ersten erzeugten Stream.
  Mit Zitat antworten Zitat
Elrond

Registriert seit: 29. Sep 2014
71 Beiträge
 
#4

AW: TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 10:40
Versuch mal im TStringStream.Create( LString ); eine Arbeitsvariable anzugeben
http://docwiki.embarcadero.com/CodeE...tring_(Delphi)

Rollo
Ich habe es mit der Variable probiert aber das gleiche Ergebnis.

Code:
   Result := TStringStream.Create(s);
Ohne genaue Kenntnis von TOpenApiDocument, TOcOpenApiBuilder, TJsonWriter (ist nicht der Delphi eigene) und TSerializer ist es schwierig dir da weiterzuhelfen.
Aber ein Hinweis: Wenn URLEncoding == true ist, dann überschreibst du das Result und hast ein Speicherleck vom ersten erzeugten Stream.
Der TJsonWriter und TSerializer (von TMS) sollten eigentlich nur ein Objekt (ein beliebiges, in diesen Fall TOpenApiDocument) in json (String) serialisieren.
Genau das passiert auch, im TStream Objekt befindet das vollständige json, verwende ich wie angedeutet ein TFileStream und speicher ihn in eine Datei ist auch alles da, mache ich das selbe mit TStringStream fehlt einfach die Hälfte.

Um es konkreter zu Formulieren: Verwende ich TStringStream, funktioniert am Ende alles, ich erhalte das Vollständige json wenn ich über http Anfrage. Wenn ich jedoch wie im Beispiel das json verändern möchte und über DataString darauf zugreife fehlt ein Großteil des Strings.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 10:42
Bin mir nicht sicher, ob das beim TStringStream notwendig ist, aber versuch vielleicht mal nach dem Serialisieren Result.Position auf 0 zu setzen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#6

AW: TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 10:43
Kannst du das Problem auf einen minimalen Testfall reduzieren und den hier einstellen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 10:53
Ein reindebuggen in TEncoding.GetString wäre hier eigentlich am sinnvollsten.
Ist Inhalt und Länge des übergebenen TBytes-Array gleich wie bei der TBytesStream-Lösung?

Tendenziell kannst du eh komplett auf TBytesStream wechseln und nur bei URLEncoding == true mithilfe einer TEncoding-Instanz dir einen String zum bearbeiten erstellen.

Ist möglicherweise DataString korrekt im Umfang, aber dein Problem ergibt sich erst nach den beiden StringReplace-Aufrufen?

Frei nach Lenin:
Zitat:
Debuggen, debuggen und nochmals debuggen.
  Mit Zitat antworten Zitat
Elrond

Registriert seit: 29. Sep 2014
71 Beiträge
 
#8

AW: TStringStream - ein Bug oder was mache ich falsch?

  Alt 4. Jun 2018, 12:41
Okay ich hab es, Streams eben...

Hat nichts mit Delphi ansich zu tun, ist eine unglückliche Verkettung von Umständen. Mit TByteStream trat das gleiche Problem auf, also habe ich mal tiefer in den Quelltext von TJsonWriter geschaut und Bingo. Das übergebene TStream Objekt wird erst bei der Freigabe von TJsonWriter geflusht, das bedeutet der restliche Inhalt der bis jetzt fehlte befand sich im Buffer.

Um sicherzugehen, dass das Problem beim TStringStream liegt habe ich als Ersatz TFileStream verwendet, wo es auch geklappt hat. Aber es hat nur geklappt weil ich ihn nicht direkt geflusht oder freigegeben habe, somit wurde er erst am Ende des Programms freigeben und zu diesen Zeitpunkt hat der TJsonWriter bereits seinen Buffer geleert (was mich letztlich auf die falsche Fährte lockte).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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