2010-05-09 11 views
8

मुझे सर्वर पर कक्षा को क्रमबद्ध करने का प्रयास करते समय समस्या है, इसे क्लाइंट को भेज दें और deserialize गंतव्य पर है।xmlns = '' की उम्मीद नहीं की गई थी जब नेस्टेड कक्षाओं को deserializing

सर्वर मैं निम्नलिखित दो वर्गों है पर:

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

और

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

(लापता प्रकार सभी enums हैं)।

यह क्रमबद्धता पर निम्न XML उत्पन्न करता है:

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

    } 

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

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

और

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

:

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

ग्राहक पक्ष पर, मैं deserialize करने के लिए है जो निम्न वर्गों में प्रयास कर रहा हूँ हालांकि, deserializer एक अपवाद फेंकता है:

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

मुझे क्या याद आ रही है या गलत कर रहा है?

संपादित करें:

अनुरोध मैं भी क्रमानुसार करने के लिए इस्तेमाल किया कोड और deserialize जोड़ रहा पर:

सर्वर:

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

ग्राहक:

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

Deserialization साथ शुरू हो जाती है

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

पहली बात भूल रहे हैं हमें कोड आप deserialize करने के लिए प्रयोग कर रहे हैं दिखा रहा है। –

+0

यह अभी भी अपूर्ण है। स्ट्रिंग 'xmlData' कहां से आती है जब इसे दूसरे छोर पर बाइट्स के रूप में क्रमबद्ध किया जाता है? अगर यह वास्तव में एक एन्कोडिंग मुद्दा है तो मुझे आश्चर्य नहीं होगा। और जब आपकी कोई ऐसी चीज नहीं है तो आपकी टिप्पणी "utf-18" का उल्लेख क्यों करती है? – Aaronaught

+0

मेरे मामले में, यह 'XmlSerializer' की गलत घोषणा के कारण था। तो उसे भी जांचें। – Mangesh

उत्तर

17

परीक्षण के बाद मुझे अंततः एक त्रुटि मिली है।यह एक एन्कोडिंग समस्या नहीं थी, न ही अन्य कोड में समस्या थी और न ही यह गायब नामस्थान था।

लापता हिस्सा deserializing जब सरणी में वस्तुओं के प्रकार के लिए एनोटेशन था।

तो मैं

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

करने के लिए अपने StatusUpdate वर्ग बदलना पड़ा और क्रमबद्धता पूरी तरह से काम करना शुरू किया।

मुझे उम्मीद है कि किसी और की मदद करेगा।

1

XmlSerializer का उपयोग करते समय यह देखना बेहद असामान्य है। मूल तत्व हमेशा इस तरह दिखना चाहिए:

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

(सुधार: XmlSerializer अक्रमांकन पर इन के बिना काम करने के लिए प्रकट होता है, लेकिन यह हमेशा क्रमबद्धता पर उन्हें कहते हैं, तो कुछ के गड़बड़ अगर वे भूल रहे हैं।)

दूसरा संपादित करें:

मैं दृढ़ता से संदेह है कि आपके मुद्दा एन्कोडिंग से संबंधित है। मैं तुम क्यों इतना क्रमबद्धता के साथ गड़बड़ करने के लिए है और बस डिफ़ॉल्ट UTF-8 एन्कोडिंग उपयोग नहीं कर सकते पता नहीं है, लेकिन परवाह किए बिना, निम्नलिखित कोड किसी भी त्रुटि के बिना काम करता है:

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

तो अगर कुछ है आपके लिए असफल रहा, क्लाइंट पक्ष पर बाइट सरणी के एक्सएमएल स्ट्रिंग के रूपांतरण के दौरान यह गलत होने की संभावना है। यही एकमात्र कोड है जिसे आप अभी भी पोस्ट नहीं किया है।

3
यहाँ

क्या यह मेरे लिए हल है:

[System.Xml.Serialization.XmlRootAttribute("nodeName", Namespace = "http://somenamespace", IsNullable = false)] 
संबंधित मुद्दे

 संबंधित मुद्दे