System.InvalidOperationException fue no controlada - serialización XML C #
-
22-09-2019 - |
Pregunta
Me hizo un documento XML utilizando la serialización XML.
Parece que este
<?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>
Mi código para hacer esto
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;
}
}
}
Ahora cuando intento de serializarlo me sale este error
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:
No estoy seguro de por qué ocurre esto.
Algunas preguntas Side - respuesta por favor después principal problema es contestada
No quería hacer un nuevo mensaje en el foro para estas 2 preguntas a menos que tengo que hacerlo.
-
¿Por qué es importante para darle un tipo de objeto? Al igual que por qué no hacer que todos los campos como cadenas?
[XmlElement("sharingKey")] public Guid SharingKey { get; set; }
¿Es sólo para cuando de serialización que obtendrá en este caso un Guid por lo que no se tarde uno tiene que convertirlo de una cadena a un GUID?
Si esto es correcto ¿qué tal si se obtiene un archivo XML de otra persona y desea de serializarlo cómo vas a saber qué objetos van a salir de ella? Como por ejemplo ¿cómo saber que mi "outof" es en realidad un tipo de decimal anulable? De hecho, ¿cómo C # saben que? No veo nada que pueda inclinar fuera que este es el tipo.
- Cuando lo reciba para realidad de serializar, me pregunto ¿cómo puedo hacer mi bucle foreach. Ya que quiero ir a través de cada uno de la lista de objetos "mywrapper". Pero en mywrapper hay una colección de objetos de tareas. hacerlo tengo que hacer un bucle dentro de mi bucle foreach para llegar a ella? ¿O hay una manera mejor?
Gracias
Solución
Usted está tratando de serializar un sola instancia de MyWrapper
, pero luego deserializar como una lista de ellos. Si usted se pega a un modo u otro (en ambos sentidos) que trabaja muy bien. Por ejemplo:
static public void SerializeToXML(MyWrapper wrapper)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<MyWrapper>));
using (TextWriter textWriter = File.CreateText("test.xml"))
{
// Create single-element list
serializer.Serialize(textWriter, new List<MyWrapper>{wrapper});
}
}
static List<MyWrapper> DeserializeFromXML()
{
XmlSerializer deserializer = new XmlSerializer(typeof(List<MyWrapper>));
using (TextReader textReader = File.OpenText("test.xml"))
{
return (List<MyWrapper>)deserializer.Deserialize(textReader);
}
}
o (para un solo elemento):
static public void SerializeToXML(MyWrapper wrapper)
{
XmlSerializer serializer = new XmlSerializer(typeof(MyWrapper));
using (TextWriter textWriter = File.CreateText("test.xml"))
{
serializer.Serialize(textWriter, wrapper);
}
}
static MyWrapper DeserializeFromXML()
{
XmlSerializer deserializer = new XmlSerializer(typeof(MyWrapper));
using (TextReader textReader = File.OpenText("test.xml"))
{
return (MyWrapper)deserializer.Deserialize(textReader);
}
}
sólo tienes que ser coherente, eso es todo.
Otros consejos
Bueno, yo supongo que el problema es: que estés serialización de un solo MyWrapper
, pero tratando de deserializar un List<MyWrapper>
Eso no va a funcionar -. Serializa un objeto único en su archivo, que pondremos en un solo objeto MyWrapper
al deserializar de ese archivo
Cambiar su deserialización a:
static MyWrapper DeserializeFromXML()
{
XmlSerializer deserializer = new XmlSerializer(typeof(MyWrapper));
TextReader textReader = new StreamReader(@"C:\New folder\test.xml");
MyWrapper tasks = (MyWrapper)deserializer.Deserialize(textReader);
textReader.Close();
return tasks;
}
y cosas deberían funcionar de nuevo.