PDahlenMedlem sedan apr. 2004778 inlägg Jag har några business objects som jag serialiserar.
Orders - En starkt typad collection av Order
Order - Ett objekt innehållande en order. Innehåller en User och en OrderRows collection
User - Ett objekt innehållande en user
OrderRows - Starkt typad collection av OrderRow
OrderRow - Objekt innehållande orderrader
För att serialisera gör jag:
Dim retVal As XmlDocument = New XmlDocument
Dim ser As XmlSerializer = New XmlSerializer(obj.GetType())
Dim sb As StringBuilder = New StringBuilder
Dim writer As TextWriter = New StringWriter(sb)
ser.Serialize(writer, obj)
Dim reader As StringReader = New StringReader(writer.ToString())
Dim dst As DataSet = New DataSet
dst.ReadXml(reader)
Return dst
Vilket gör att jag får ut ett DataSet som jag sedan skriver ut till browsern med dst.GetXml efter att jag satt ContentType till text/xml.
Allt funkar finfint förutom ett litet problem. Istället för att få ut OrderRows för en Order så får alla Ordrar de OrderRows som hör till den allra sista Ordern.
Själva objektskapandet går till så här:
1. myOrders skapas och fylls
2. För varje Order som skapas i myOrders så...
3. ...skapas en User och fylls...
4. ...skapas en OrderRows collection och fylls...
För att kontrollera så kör jag ut varje orders id och det orderid som står på varje orderrad innan jag serialiserar och då stämmer det. Så felet verkar ligga i hur Order eller OrderRow serialiseras.
Är det någon här som pysslat med XmlSerializer och sett liknande problem?
Kan det bli problem i DataSettet med relationer eller nåt?
Mitt alternativ är att loopa igenom alla ordrar och skapa Xml-dokumentet manuellt.
JonMedlem sedan juli 20011 304 inlägg Jag serialiserar och deserialiserar mina konfigurationsobjekt. Har inga problem, men jag använder mig inte av DataSet. Får man fråga varför du gör det? :)
Jag serialiserar ner objekten till xml och sen deserialiserar jag tillbaka dom till objekt som jag använder i min applikation. I ditt fall känns det som om du skulle kunna använda xml direkt eller har jag missat något?
PDahlenMedlem sedan apr. 2004778 inlägg Den serialiseringsfunktionen jag använder ovan hittade jag i nån artikel. Har så ont om tid hela tiden så man får oftast köra med det man hittar. Det är därför det blev dataset.
Eftersom jag genererar XML och hämtar detta från en desktopapplikation via URL så kan jag definitivt använda xml direkt.
Nån funktion du har lust att dela med dig av?
JonMedlem sedan juli 20011 304 inlägg Jag gör så här:
StreamWriter writer = null;
XmlSerializer serializer;
string folder = "~/xml";
try
{
writer = File.CreateText(Server.MapPath(folder + "/test.xml"));
serializer = new XmlSerializer(typeof(ConfigObject));
serializer.Serialize(writer,co);
}
finally
{
if (writer != null)
writer.Close();
}
Detta spara xml-filer på hårddisk men du borde ju kunna serialisera till ett xml-document i minnet och använda om du inte vill gå via hårddisk.
Ett exemplel på samma sak från msdn: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxmlserializationxmlserializerclasstopic.asp
PDahlenMedlem sedan apr. 2004778 inlägg Det jag behöver göra är att skriva ut XML-koden. I min code-behind sätter jag ContentType till text/xml. När jag sen skriver ut den genererade XML-koden så tolkar läsaren det som XML. I mitt fall så tolkar min applikation det som ren XML.
JonMedlem sedan juli 20011 304 inlägg Du kanske kan serialisera till en StringWriter istället. Typ:
XmlSerializer xs = new XmlSerializer(typeof(Klassen));
StringWriter sw = new StringWriter();
xs.Serialize(sw, emp);
sw innehåller nu ett helt xmldocument som du kan bånga ut i ett xml-element, sätta som datasource till en grid eller respons:a ut till klienten direkt.