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);
}
我正在尝试通过 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);
}