【问题标题】:XmlException: Root element is missing. C# UnityXmlException:缺少根元素。 C# 统一
【发布时间】:2020-07-13 16:33:19
【问题描述】:

我正在尝试通过xmlSerializer 发送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)

【问题讨论】:

    标签: c# unity3d xmlserializer


    【解决方案1】:

    在这一行

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

    【讨论】:

    • 天哪,谢谢!!!!这有效!!!!!!!你救救我,我超级开心tyyyyy!!!!
    • 如果这对你有帮助,@Narsh,请考虑accepting the answer
    【解决方案2】:

    您不能直接(反)序列化为List&lt;T&gt;

    您宁愿需要一个包装类,例如

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

    在智能手机上输入,但我希望思路清晰

    【讨论】:

    • 是的,我有课,但还是不行。我认为问题在于 xmlSerializer 如何对列表进行序列化,我不知道....当统一尝试反序列化(同一类)时,当给出错误时,我不知道该怎么做,我非常不知所措我需要在 2 天内提交它
    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多