System.InvalidOperationException wurde unbehandelt - XMl-Serialisierung in C#
Machte ich ein xml-Dokument durch XML-Serialisierung.
Sieht es so aus
<?xml version="1.0" encoding="utf-8"?>
<Course xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<courseName>Comp 1510</courseName>
<backgroundColor>#ffffff</backgroundColor>
<fontColor>#ffffff</fontColor>
<sharingKey>ed35d1f8-6be1-4f87-b77f-c70298e5abbb</sharingKey>
<task type="Assignment">
<taskName>First Task</taskName>
<description>description</description>
<taskDueDate>2010-01-24T12:41:20.0321826-08:00</taskDueDate>
<weight xsi:nil="true" />
<beforeDueDateNotification>30</beforeDueDateNotification>
<outOf>50.4</outOf>
</task>
</Course>
Mein Code, um diese
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
[XmlRoot("Course")]
public class MyWrapper
{
public MyWrapper()
{
TaskList = new List<Tasks>();
}
[XmlElement("courseName")]
public string CourseName { get; set; }
[XmlElement("backgroundColor")]
public string BackgroundColor { get; set; }
[XmlElement("fontColor")]
public string FontColor { get; set; }
[XmlElement("sharingKey")]
public Guid SharingKey { get; set; }
[XmlElement("task")]
public List<Tasks> TaskList { get; set; }
}
public class Tasks
{
[XmlAttribute("type")]
public string Type { get; set; }
[XmlElement("taskName")]
public string TaskName { get; set; }
[XmlElement("description")]
public string Description { get; set; }
[XmlElement("taskDueDate")]
public DateTime TaskDueDate { get; set; }
[XmlElement("weight")]
public decimal? Weight { get; set; }
[XmlElement("beforeDueDateNotification")]
public int BeforeDueDateNotification { get; set; }
[XmlElement("outOf")]
public decimal? OutOf { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyWrapper wrap = new MyWrapper();
wrap.CourseName = "Comp 1510";
wrap.FontColor = "#ffffff";
wrap.BackgroundColor = "#ffffff";
wrap.SharingKey = Guid.NewGuid();
Tasks task = new Tasks()
{
TaskName = "First Task",
Type = "Assignment",
TaskDueDate = DateTime.Now,
Description = "description",
BeforeDueDateNotification = 30,
OutOf = 50.4M
};
wrap.TaskList.Add(task);
SerializeToXML(wrap);
var grab = DeserializeFromXML();
foreach (var item in grab)
{
}
}
static public void SerializeToXML(MyWrapper list)
{
XmlSerializer serializer = new XmlSerializer(typeof(MyWrapper));
TextWriter textWriter = new StreamWriter(@"C:\New folder\test.xml");
serializer.Serialize(textWriter, list);
textWriter.Close();
}
static List<MyWrapper> DeserializeFromXML()
{
XmlSerializer deserializer = new XmlSerializer(typeof(List<MyWrapper>));
TextReader textReader = new StreamReader(@"C:\New folder\test.xml");
List<MyWrapper> tasks;
tasks = (List<MyWrapper>)deserializer.Deserialize(textReader);
textReader.Close();
return tasks;
}
}
}
Wenn ich jetzt versuche zu de-serialisieren ich bekomme diese Fehlermeldung
System.InvalidOperationException was unhandled
Message="There is an error in XML document (2, 2)."
Source="System.Xml"
StackTrace:
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
at ConsoleApplication1.Program.DeserializeFromXML() in C:\Users\chobo2\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs:line 55
at ConsoleApplication1.Program.Main(String[] args) in C:\Users\chobo2\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs:line 34
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.InvalidOperationException
Message="<Course xmlns=''> was not expected."
Source="ap72r7cf"
StackTrace:
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderList1.Read5_ArrayOfMyWrapper()
InnerException:
Ich bin nicht sicher, warum dies geschieht.
Seite einige Fragen - bitte um Antwort nach dem wichtigsten problem beantwortet
Wollte ich nicht machen, einen neuen forum-post für diese 2 Fragen, wenn ich zu.
-
Warum ist es wichtig, dass es ein Objekt geben? Wie warum nicht alle Felder als strings?
[XmlElement("sharingKey")] public Guid SharingKey { get; set; }
Ist es nur, wenn Sie de-serialisieren, dass Sie in diesem Fall eine Guid, so dass Sie nicht später zu einem umwandeln von einem string in eine Guid?
Wenn dies richtig ist, wie wäre es, wenn Sie erhalten eine xml-Datei von jemand anderes, und Sie wollen, zu de-serialisieren, wie werden Sie wissen, welche Objekte kommen heraus? Wie, zum Beispiel, wie würden Sie wissen, dass mein "Währungskrise" ist eigentlich ein Typ, der null-dezimal? In der Tat, wie arbeitet C# wissen? Ich sehe nicht, würde alles, was Tipp-off, dass dies die Art.
- Wenn ich es tatsächlich de-serialisieren, Frage ich mich, wie mache ich meiner foreach-Schleife. Da ich möchte, dass Sie gehen durch jeden von der Liste der "MyWrapper" Objekte. Aber in MyWrapper es ist eine Sammlung von Task-Objekten. Also muss ich eine for-Schleife in meiner foreach-Schleife, um auf Sie? Oder gibt es eine bessere Möglichkeit?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie zu serialisieren eines single Instanz
MyWrapper
, aber dann Deserialisieren es als eine Liste von Ihnen. Wenn Sie an der einen oder anderen Art (oder so) funktioniert es einwandfrei. Zum Beispiel:oder (für ein einzelnes element):
Du mußt nur konsequent sein, das ist alles.
Nun, ich denke, das problem ist: Sie sind serialisiert einen einzelnen
MyWrapper
, sondern versucht zu Deserialisieren eineList<MyWrapper>
Nicht zur Arbeit zu gehen - Sie serialisieren eines einzelnen Objekts in Ihrer Datei, Sie erhalten wieder ein einzelnes Objekt
MyWrapper
beim Deserialisieren aus dieser Datei.Ändern Sie Ihre Deserialisierung zu:
und die Dinge wieder funktionieren sollte.