Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#19

Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?

  Alt 7. Feb 2007, 11:44
Zitat von Alexander:
Zitat:
Da kennt wohl einer Reflector noch nicht?
Ehrlich gesagt, nicht wirklich. Bei der geringen Zeit, die ich momentan habe .
Reflector spart Zeit, damit kannst du durch deine und fremde Binaries surfen wie ein einem Browser.
Zitat:
(Hast du dir dein Wissen eigentlich selbst beigebracht? )
Steht ja genug im Internet, und ich habe einen gesunden (kranken?) Spieltrieb.

Zitat:
Leider ja auch nicht. Hatte ich ja schon versucht. Der SQL-String wird komplett richtig ausgelesen. Auch die Komponente hat den eigentlich den richtigen String bekommen. Nur irgendetwas scheint zu stören und es kommt zum Fehler.
Kann es sein, dass Jet zu blöd ist um einen einzelnen line feed (#10) als Zeilenumbruch/Whitespace anzusehen?
Denn bei einem Zeilenumbruch geht definitiv der Cr (#13) flöten, wenn man nicht explizit über einen XmlReader deserialisiert...
Hier mal zur Anschauung
Delphi-Quellcode:
type
  SampleClass = public class
  public
    property CDataString : CData;
  end;

class method ConsoleApp.Main;
  const fileName = 'data.xml';
  const sampleString = 'SELECT A, B'#13#10
                       'FROM C';
  
  method ShowWhiteSpaces(value : String);
  begin
    Console.WriteLine(value.Replace(#32, '[Space]')
                           .Replace(#9, '[Tab]')
                           .Replace(#13#10, '[CrLf]')
                           .Replace(#13, '[Cr]')
                           .Replace(#10, '[Lf]'));
  end;
begin
  var serializer := new XmlSerializer(typeof(SampleClass));
  
  if not File.Exists(fileName) then
    using stream := new FileStream(fileName, FileMode.Create) do
    using writer := new XmlTextWriter(stream, Encoding.UTF8) do
    begin
      serializer.Serialize(writer, new SampleClass(CDataString := sampleString));
    end;
  
  // mit reader
  using stream := new FileStream(fileName, FileMode.Open) do
  using reader := new XmlTextReader(stream) do
    with s := serializer.Deserialize(reader) as SampleClass do
      ShowWhiteSpaces(s.CDataString);
  
  // ohne reader
  using stream := new FileStream(fileName, FileMode.Open) do
    with s := serializer.Deserialize(stream) as SampleClass do
      ShowWhiteSpaces(s.CDataString);
        
  Console.ReadLine();
end;
Interessant ist was dabei rauskommt:
Output
SELECT[Space]A,[Space]B[CrLf]FROM[Space][Space][Space]C
SELECT[Space]A,[Space]B[Lf]FROM[Space][Space][Space]C
Wie du siehst verhält sich der Overload von DeSerialize, der einen Stream schluckt, nicht wie es ein XmlReader per default macht.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat