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

XmlException: Root element is missing. C# Unity

我正在尝试通过 xmlSerializer 从接口向 unity 发送 list<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
在那之后,要么流中根本没有数据,要么根已经丢失。
所以在下一行,序列化程序从损坏的流中读取:

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