簡體   English   中英

XmlException:缺少根元素。 C# 統一

[英]XmlException: Root element is missing. C# Unity

我正在嘗試通過xmlSerializerlist<clase_A>從接口發送到統一。

這是我的服務器代碼:

using (connectedTcpClient = tcpListener.AcceptTcpClient())
            {               
                using (NetworkStream stream = connectedTcpClient.GetStream())
                {
                    int length;
                    XmlSerializer xmls = new XmlSerializer(typeof(List<Clase_comando>));
                                        
                    while ((stream.CanRead && (length = stream.Read(bytes, 0, bytes.Length)) != 0))
                    {
                        List<Clase_comando> com = null;
                        var b = new byte[10000];                                                      
                        com = (List<Clase_comando>)xmls.Deserialize(stream);
                            //Here i get the problem
                        

                    }
                }
            }

下面是 Visual Studio 的代碼:

NetworkStream stream = socketConnection.GetStream();
StreamWriter sw = new StreamWriter(stream);
sw.AutoFlush = true;
XmlSerializer xmls = new XmlSerializer(typeof(List<Clase_A>));

if (stream.CanWrite){
   z = My list

   byte[] b = new byte[10000];
   Stream st = new MemoryStream(b);
   xmls.Serialize(st, z);
   stream.Write(b, 0, b.Length);
   stream.Dispose();
   }

問題是當我統一接收接口數據時,它會拋出這個異常:

 XmlException: Root element is missing. System.Xml.XmlTextReaderImpl.Throw (System.Exception e) (at <7fd195060d8c41448694ab221d3b56ca>:0) System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo (System.String res) (at <7fd195060d8c41448694ab221d3b56ca>:0)

Afaik 你不能直接(反)序列化為List<T>

您寧願需要一個包裝器 class ,例如

[Serializable]
[XmlRoot]
public class Root
{
    [XmlArray]
    public List<Clase_comando> Comandos;
}

using (NetworkStream stream = connectedTcpClient.GetStream())
{
    int length;
    XmlSerializer xmls = new XmlSerializer(typeof(Root));
                                    
    while ((stream.CanRead && (length = stream.Read(bytes, 0, bytes.Length)) != 0))
    {
        var b = new byte[10000];                                                      
        List<Clase_comando> com = ((Root)xmls.Deserialize(stream)).Comandos;                    
    }
}

在另一邊相應地

[Serializable]
[XmlRoot]
public class Root
{
    [XmlArray]
    public List<Clase_A> Comandos;
}

XmlSerializer xmls = new XmlSerializer(typeof(Root));

if (stream.CanWrite)
{
    var root = new Root(){ Comandos = MyList };

    byte[] b = new byte[10000];
    using(var st = new MemoryStream(b))
    {
        xmls.Serialize(st, root);
        stream.Write(b, 0, b.Length);
    }
}

在智能手機上打字,但我希望這個想法很清楚

在這一行

while ((stream.CanRead && (length = stream.Read(bytes, 0, bytes.Length)) != 0))

數據從stream讀取到bytes
之后,stream 中要么沒有數據,要么根已經丟失。
所以在下一行,序列化程序從損壞的 stream 中讀取:

com = (List<Clase_comando>)xmls.Deserialize(stream);

試試這個代碼:

using (NetworkStream stream = connectedTcpClient.GetStream())
{
    var xmls = new XmlSerializer(typeof(List<Clase_comando>));
            
    var com = (List<Clase_comando>)xmls.Deserialize(stream);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM