xmlns=" wurde nicht erwartet, dass beim Deserialisieren von geschachtelten Klassen
Ich habe ein problem beim Versuch zu serialisieren der Klasse auf einem server zum client zu senden und Deserialisieren auf dem Ziel.
Auf dem server habe ich die folgenden zwei Klassen:
[XmlRoot("StatusUpdate")]
public class GameStatusUpdate
{
public GameStatusUpdate()
{}
public GameStatusUpdate(Player[] players, Command command)
{
this.Players = players;
this.Update = command;
}
[XmlArray("Players")]
public Player[] Players { get; set; }
[XmlElement("Command")]
public Command Update { get; set; }
}
und
[XmlRoot("Player")]
public class Player
{
public Player()
{}
public Player(PlayerColors color)
{
Color = color;
...
}
[XmlAttribute("Color")]
public PlayerColors Color { get; set; }
[XmlAttribute("X")]
public int X { get; set; }
[XmlAttribute("Y")]
public int Y { get; set; }
}
(Die fehlenden Arten sind alle enums).
Dieser erzeugt die folgenden XML-Serialisierung:
<?xml version="1.0" encoding="utf-16"?>
<StatusUpdate>
<Players>
<Player Color="Cyan" X="67" Y="32" />
</Players>
<Command>StartGame</Command>
</StatusUpdate>
Auf der client-Seite, ich bin versucht zu Deserialisieren, die in folgenden Klassen:
[XmlRoot("StatusUpdate")]
public class StatusUpdate
{
public StatusUpdate()
{
}
[XmlArray("Players")]
[XmlArrayItem("Player")]
public PlayerInfo[] Players { get; set; }
[XmlElement("Command")]
public Command Update { get; set; }
}
und
[XmlRoot("Player")]
public class PlayerInfo
{
public PlayerInfo()
{
}
[XmlAttribute("X")]
public int X { get; set; }
[XmlAttribute("Y")]
public int Y { get; set; }
[XmlAttribute("Color")]
public PlayerColor Color { get; set; }
}
Jedoch die deserializer wirft eine Ausnahme:
There is an error in XML document (2, 2).
<StatusUpdate xmlns=''> was not expected.
Was ich bin fehlt oder falsch??
EDIT:
Auf Wunsch, ich bin auch das hinzufügen von code zum serialisieren und Deserialisieren:
Server:
public static byte[] SerializeObject(Object obj)
{
XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());
StringWriter writer = new StringWriter();
//Clear pre-defined namespaces
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
xsn.Add("", "");
xmlSerializer.Serialize(writer, obj, xsn);
writer.Flush();
//Send as little-endian UTF-16 string because the Serializer denotes XML as
//utf-18 which cannot be easly changed
UnicodeEncoding encoder = new UnicodeEncoding(false, false);
return encoder.GetBytes(writer.ToString());
}
Client:
public static object DeserializeXml(string xmlData, Type type)
{
XmlSerializer xmlSerializer = new XmlSerializer(type);
StringReader reader = new StringReader(xmlData);
object obj = xmlSerializer.Deserialize(reader);
return obj;
}
Deserialisierung aufgerufen wird, mit
StatusUpdate update = (StatusUpdate) Util.DeserializeXml(xmlData, typeof (StatusUpdate));
- Die erste Sache, die Sie fehlen nicht und zeigen Sie uns den code, die Sie verwenden, zu Deserialisieren.
- Dieses ist noch unvollständig. Wo kommt der string
xmlData
kommen, wenn es serialisiert bytes am anderen Ende? Ich wäre nicht überrascht, wenn das ist tatsächlich ein encoding-Problem. Und warum hat Ihr Kommentar erwähnen "utf-18" wenn es gibt keine solche Sache? - In meinem Fall war es wegen der falschen Deklaration von
XmlSerializer
. So überprüfen Sie das auch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach viel testen habe ich endlich den Fehler gefunden. Es war nicht ein encoding-problem, weder wurde das problem in den anderen code noch war es die fehlende namespace.
Den fehlenden Teil wurde die annotation für den Typ der Objekte im array, wenn Deserialisieren.
So musste ich meine
StatusUpdate
Klasseund Serialisierung begann perfekt.
Ich hoffe, das hilft jemand anderes.
hier ist, was Sie gelöst für mich:
Dass ist eigentlich sehr ungewöhnlich, um zu sehen, wenn Sie die
XmlSerializer
. Das root-element sollte immer wie folgt Aussehen:(Korrektur: Die
XmlSerializer
hat erscheinen zu arbeiten, ohne diese auf der Deserialisierung, aber es fügt immer auf die Serialisierung, so ist etwas faul, wenn Sie fehlen.)Zweiter edit:
Ich vermute stark, dass dein Problem ist die Codierung beziehen. Ich weiß nicht, warum Sie zu verwirren haben mit der Serialisierung so viel und kann nicht einfach den Standard UTF-8-Codierung, aber egal, der folgende code funktioniert ohne Fehler:
So dass, wenn etwas fehlschlägt, ist es sehr wahrscheinlich schief gehen während der Konvertierung von byte-array in eine XML-Zeichenfolge, die auf der client-Seite. Das ist der einzige code, den Sie noch noch nicht gepostet.
Hab ich gelöst mit folgenden