2010-05-09 16 views
8

Sunucuda sınıfi serileştirme, istemciye gönderme ve serileştirme hedef üzerinde çalışırken sorun yaşıyorum. Ben şu iki sınıfları sunucudaxmlns = '' yuvalanmış sınıfların serileştirilmesinde beklenmiyor

:

[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; } 
} 

ve

[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; } 
} 

(eksik tipi tüm çeteleler vardır).

Bu serileştirme aşağıdaki XML oluşturur:

[XmlRoot("StatusUpdate")] 
public class StatusUpdate 
{ 
    public StatusUpdate() 
    { 

    } 

    [XmlArray("Players")] 
    [XmlArrayItem("Player")] 
    public PlayerInfo[] Players { get; set; } 

    [XmlElement("Command")] 
    public Command Update { get; set; } 
} 

ve

[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; } 
} 

: istemci tarafında

<?xml version="1.0" encoding="utf-16"?> 
<StatusUpdate> 
    <Players> 
    <Player Color="Cyan" X="67" Y="32" /> 
    </Players> 
    <Command>StartGame</Command> 
</StatusUpdate> 

, aşağıdaki sınıflara bu serisini çalışılıyor Ancak, deserializer bir istisna atar:

There is an error in XML document (2, 2). 
<StatusUpdate xmlns=''> was not expected. 

Neyi eksik veya yanlış yapıyorum?

DÜZENLEME: Ben de seri hale getirmek için kullanılan kod ve serisini ekliyorum İstek üzerine

:

Sunucu:

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()); 
    } 

Müşteri:

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; 
    } 

Seri kaldırma ile çağrılır

StatusUpdate update = (StatusUpdate) Util.DeserializeXml(xmlData, typeof (StatusUpdate)); 
+1

sen bize serisini kullandığınız kod gösterilmiyor kaçırıyorsun ilk şey. –

+0

Bu hala eksik. XmlData dizesi, diğer uçta bayt olarak serileştirildiğinde nereden gelir? Bu aslında bir kodlama sorunuysa şaşırmam. Yorumunuz neden böyle bir şey olmadığında "utf-18" den bahsediyor? – Aaronaught

+0

Benim durumumda, yanlış 'XmlSerializer' beyanı yüzünden oldu. Bunu da kontrol et. – Mangesh

cevap

17

Test ettikten sonra sonunda bir hata buldum.Bu bir kodlama problemi değildi, diğer koddaki problem de değildi, ne de eksik isim alanıydı.

Eksik parça, seri hale getirme sırasında dizideki nesnelerin türü için ek açıklamaydı.

yüzden

[XmlRoot("StatusUpdate")] 
public class StatusUpdate 
{ 
    public StatusUpdate() 
    { 

    } 

    [XmlArray("Players"), XmlArrayItem(ElementName = "Player", Type = typeof(PlayerInfo))] 
    public PlayerInfo[] Players { get; set; } 

    [XmlElement("Command")] 
    public ServerCommand Update { get; set; } 
} 

benim StatusUpdate sınıfını değiştirmek zorunda kaldı ve seri mükemmel çalışmaya başladı.

Umarım bir başkasına yardım eder. Burada

1

Bu, XmlSerializer'u kullanırken aslında son derece sıra dışıdır. (: XmlSerializer serisini kaldırma bu olmadan çalışmak görünmüyor, ama her zaman serileştirme bunları ekler, böylece bir şeylerin balık kaçırdıklarını eğer Düzeltme.)

<MyClass 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

: Kök öğe her zaman şu şekilde görünmelidir

İkinci düzenleme: şiddetle Sorununuz kodlayan ilgili şüpheleniyorsanız

. bu kadar serileştirme uğraşmak zorunda ve sadece varsayılan UTF-8 kodlaması neden kullanamazsınız bilmiyorum ama ne olursa olsun, aşağıdaki kod hatasız çalışır:

MyClass m = new MyClass() { X = 4, Y = 8 }; 
byte[] data = SerializeObject(m); 
string xml = Encoding.Unicode.GetString(data); 
Console.WriteLine(xml); 
m = (MyClass)DeserializeXml(xml, typeof(MyClass)); 

Yani eğer bir şeydir Sizin için başarısız olan, bayt dizisinin istemci tarafında XML dizesine dönüştürülmesi sırasında büyük olasılıkla yanlıştır. Bu sadece adresinde kayıtlı olan numaralı kod.

3

benim için çözüldü budur:

[System.Xml.Serialization.XmlRootAttribute("nodeName", Namespace = "http://somenamespace", IsNullable = false)] 
İlgili konular