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
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());
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.
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ß
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!
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..