Laden...

Problem bei Serialisierung

Erstellt von Foermchen82 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.039 Views
F
Foermchen82 Themenstarter:in
101 Beiträge seit 2005
vor 13 Jahren
Problem bei Serialisierung

Hallo zusammen,

ich habe folgenden Code:


public static void Main(string[] args)
        {
            TestClass TestObj = new TestClass();

            // Set some dummy values
            TestObj.SomeString = "foo";

            TestObj.Settings.Add("A");
            TestObj.Settings.Add("B");
            TestObj.Settings.Add("C");

            XmlSerializer SerializerObj = new XmlSerializer(typeof(TestClass));
            
            //serialize to file
            TextWriter WriteFileStream = new StreamWriter(@"C:\test.xml");
            SerializerObj.Serialize(WriteFileStream, TestObj);
            
            // serialize to string
            MemoryStream memoryStream = new MemoryStream();
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
            SerializerObj.Serialize(xmlTextWriter, TestObj);
            UTF8Encoding encoding = new UTF8Encoding();
            String constructedString = encoding.GetString(((MemoryStream)xmlTextWriter.BaseStream).ToArray());
            
            // Cleanup
            WriteFileStream.Close();
            Console.WriteLine(constructedString);
            Console.ReadLine();
        }

        [Serializable()]
        public class TestClass
        {
            private string someString;
            public string SomeString
            {
                get { return someString; }
                set { someString = value; }
            }

            private List<string> settings = new List<string>();
            public List<string> Settings
            {
                get { return settings; }
                set { settings = value; }
            }

            // These will be ignored
            [NonSerialized()]
            private int willBeIgnored1 = 1;
            private int willBeIgnored2 = 1;

        }

Die serialisierung in die Datei klappt wunderbar:


 <?xml version="1.0"?>
        <TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <SomeString>foo</SomeString>
          <Settings>
            <string>A</string>
            <string>B</string>
            <string>C</string>
          </Settings>
        </TestClass>	

Die Serialisierung in den String hat aber ein komisches Zeichen am Anfang:


?<?xml version="1.0" encoding="utf-8"?><TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SomeString>foo</SomeString><Settings><string>A</string><string>B</string><string>C</string></Settings></TestClass>

Das "?" ist scheinbar nur die Anzeige in der Windows Konsole. der ASCII Code dazu ist: 65279

Wieso ist das da vorangestellt? Lese ich den String dann wieder in ein XMLDocument ein klappt das natürlich nicht.
Was mach ich falsch?

Danke im Voraus

EDIT: Wenn ich auf ASCII-Encoding stelle klappt es, jedoch hab ich dann dass Problem mit Umlauten. Deswegen würde ich gerne UTF-8 nehmen

F
Foermchen82 Themenstarter:in
101 Beiträge seit 2005
vor 13 Jahren

habs gefunden:

Wenn ich die Encoding Instanz früher erstelle und die Instanz auch bei der instanzierung des XMLTextWriter verwende, dann klappt es.

Kann mir das aber bitte einer erklären?


MemoryStream memoryStream = new MemoryStream();
 UTF8Encoding encoding = new UTF8Encoding();
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, encoding );
            SerializerObj.Serialize(xmlTextWriter, TestObj);
           
            String constructedString = encoding.GetString(((MemoryStream)xmlTextWriter.BaseStream).ToArray());

799 Beiträge seit 2007
vor 13 Jahren

Siehe dazu hier:

Das UTF8Encoding-Objekt, das von dieser Eigenschaft zurückgegeben wird, weist möglicherweise das entsprechende Verhalten für die Anwendung nicht auf. Es ersetzt jede Zeichenfolge, die es nicht codieren kann, und jedes Byte, das es nicht mit einem Fragezeichenzeichen decodieren kann, mithilfe (""?)

Irgendein Interna ist anders gesetzt in diesem Std.-Objekt weswegen du Ärger hattest.

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
849 Beiträge seit 2006
vor 13 Jahren

Hallo, das was du da siehst ist die Byte Order Mark

Dein Code sieht auch etwas verwirrend aus.. besonders der teil wo du auf den BaseStream drauf zugreifst.. das ist meist keine gute Idee.

Normalerweise brauchst Du den TextWriter und XmlTextWriter überhaupt nicht. Benutz einfach nur den XmlSerializer.. (es sei denn Du hast anforderungen die das nicht erlauben) Default ist da IMHO schon UTF8.

Gruß

F
Foermchen82 Themenstarter:in
101 Beiträge seit 2005
vor 13 Jahren

Hallo, das was du da siehst ist die
>

Dein Code sieht auch etwas verwirrend aus.. besonders der teil wo du auf den BaseStream drauf zugreifst.. das ist meist keine gute Idee.

Normalerweise brauchst Du den TextWriter und XmlTextWriter überhaupt nicht. Benutz einfach nur den XmlSerializer.. (es sei denn Du hast anforderungen die das nicht erlauben) Default ist da IMHO schon UTF8.

Gruß

So waren leider alle Beispiele gestrickt, die ich zur XML-Serialisierung in einen String gefunden habe. Hast du eine alternative?
Danke im Voraus!

849 Beiträge seit 2006
vor 13 Jahren

Ok, wenn man in einen String Serialisieren will geht das nicht ganz ohne reader/writer
aber man kann es vermindern.:



class Program
    {
        static void Main(string[] args)
        {
            var fupp = new Test {Fupp = "Test"};

            XmlSerializer ser = new XmlSerializer(typeof(Test));
            string text = null;

            //Serialize to string
            using(var writer = new StringWriter())
            {
                ser.Serialize(writer,fupp);
                text = writer.ToString();
            }

            //Serialize to File
            using (var writer = new StreamWriter(@"C:\TFS\Test.txt"))
            {
                ser.Serialize(writer, fupp);
            }


            //Deserialize from string
            Test deserialized = null;
            using(var reader = new StringReader(text))
            {
                deserialized = (Test) ser.Deserialize(reader);
            }

            //Deserialize from File
            using (StreamReader reader = new StreamReader(@"C:\TFS\Test.txt"))
            {
                deserialized = (Test)ser.Deserialize(reader);
            }
        }
    }

    [Serializable]
    public class Test
    {
        public string Fupp { get; set; }
    }

edit: ok.. hatte irgendwie in Erinnerung das XmlSerializer eine ctor überladung hatte die nen path annimmt..