Привет всем, я переключился на сериализацию Json, на этот раз сериализация работает отлично, проблема связана с десериализацией. У меня есть исключение ...
Ошибка:
XmlException: Encountered an unexpected character '
System.Xml.XmlExceptionHelper.ThrowXmlException (System.Xml.XmlDictionaryReader reader, System.Xml.XmlException exception) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.XmlJsonReader.Read () (at <3abed3971fab48b2a085712365cc627f>:0)
System.Xml.XmlBaseReader.ReadEndElement () (at <3abed3971fab48b2a085712365cc627f>:0)
System.Xml.XmlBaseReader.ReadElementContentAsString () (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.XmlReaderDelegator.ReadElementContentAsString () (at <3abed3971fab48b2a085712365cc627f>:0)
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <1f0c1ef1ad524c38bbc5536809c46b48>:0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <1f0c1ef1ad524c38bbc5536809c46b48>:0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <1f0c1ef1ad524c38bbc5536809c46b48>:0)
System.Runtime.Serialization.Json.JsonFormatReaderInterpreter.ReadValue (System.Type type, System.String name) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.JsonFormatReaderInterpreter.ReadMembers (System.Int32 index, System.Runtime.Serialization.ClassDataContract classContract, System.Runtime.Serialization.BitFlagsGenerator expectedElements, System.Int32& memberIndex) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.JsonFormatReaderInterpreter.ReadMembers (System.Runtime.Serialization.ClassDataContract classContract, System.Runtime.Serialization.ExtensionDataObject extensionData) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.JsonFormatReaderInterpreter.ReadClass (System.Runtime.Serialization.ClassDataContract classContract) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.JsonFormatReaderInterpreter.ReadFromJson (System.Runtime.Serialization.XmlReaderDelegator xmlReader, System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson context, System.Xml.XmlDictionaryString emptyDictionaryString, System.Xml.XmlDictionaryString[] memberNames) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.JsonFormatReaderGenerator+CriticalHelper+<>c__DisplayClass0_0.<GenerateClassReader>b__0 (System.Runtime.Serialization.XmlReaderDelegator xr, System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson ctx, System.Xml.XmlDictionaryString emptyDictionaryString, System.Xml.XmlDictionaryString[] memberNames) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.JsonClassDataContract.ReadJsonValueCore (System.Runtime.Serialization.XmlReaderDelegator jsonReader, System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson context) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.JsonDataContract.ReadJsonValue (System.Runtime.Serialization.XmlReaderDelegator jsonReader, System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson context) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadJsonValue (System.Runtime.Serialization.DataContract contract, System.Runtime.Serialization.XmlReaderDelegator reader, System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson context) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson.ReadDataContractValue (System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlReaderDelegator reader) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize (System.Runtime.Serialization.XmlReaderDelegator reader, System.String name, System.String ns, System.Type declaredType, System.Runtime.Serialization.DataContract& dataContract) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize (System.Runtime.Serialization.XmlReaderDelegator xmlReader, System.Type declaredType, System.Runtime.Serialization.DataContract dataContract, System.String name, System.String ns) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserialize (System.Runtime.Serialization.XmlReaderDelegator xmlReader, System.Type declaredType, System.Runtime.Serialization.DataContract dataContract, System.String name, System.String ns) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject (System.Runtime.Serialization.XmlReaderDelegator xmlReader, System.Boolean verifyObjectName) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject (System.Runtime.Serialization.XmlReaderDelegator reader, System.Boolean verifyObjectName, System.Runtime.Serialization.DataContractResolver dataContractResolver) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (System.Runtime.Serialization.XmlReaderDelegator reader, System.Boolean verifyObjectName, System.Runtime.Serialization.DataContractResolver dataContractResolver) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (System.Runtime.Serialization.XmlReaderDelegator reader, System.Boolean verifyObjectName) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject (System.Xml.XmlDictionaryReader reader) (at <3abed3971fab48b2a085712365cc627f>:0)
System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject (System.IO.Stream stream) (at <3abed3971fab48b2a085712365cc627f>:0)
Server.Update () (at Assets/Scripts/Network/Server.cs:116)
код :
отправить функцию из клиентского класса:
public void sendToServer(NMSG msg, int channelId)
{
if (!PacketHandler.packets.Contains(msg.GetType()))
{
Debug.Log("packet not registered");
return;
}
byte error;
byte[] buffer;
var stream = new MemoryStream();
var serializer = new DataContractJsonSerializer(typeof(NMSG));
serializer.WriteObject(stream, msg);
buffer = stream.ToArray();
int bufferSize = buffer.Length;
NetworkTransport.Send(hostId, connectionId, channelId, buffer, bufferSize, out error);
}
код, который десериализует:
MemoryStream memoryStream = new MemoryStream(recBuffer);
memoryStream.Position = 0;
var ser = new DataContractJsonSerializer(typeof(NMSG));
NMSG msg = (NMSG)ser.ReadObject(memoryStream);
onData(connectionId, channelId, recHostId, msg);
Класс НМСГ:
using System;
using System.Runtime.Serialization;
[DataContract]
[KnownType("GetKnownTypes")]
public abstract class NMSG
{
[DataMember]
private byte? discriminator = null;
public NMSG()
{
}
public NMSG(byte discriminator)
{
this.discriminator = discriminator;
}
public byte? getPacketId()
{
return this.discriminator;
}
public static Type[] GetKnownTypes()
{
return PacketHandler.packets.ToArray();
}
public abstract void HandleServer(NMSG msg, int connectionId);
public abstract void HandleClient(NMSG msg);
}
класс, который я отправляю на сервер
[DataContract]
public class NMSG_ConnectAccount : NMSG
{
[DataMember]
public string username;
[DataMember]
public string password;
public NMSG_ConnectAccount()
{
}
public NMSG_ConnectAccount(string username, string password) : base((byte)PacketHandler.packets.IndexOf(typeof(NMSG_ConnectAccount)))
{
this.username = username;
this.password = password;
}
public override void HandleClient(NMSG msg)
{
}
public override void HandleServer(NMSG msg, int connectionId)
{
NMSG_ConnectAccount cmsg = (NMSG_ConnectAccount)msg;
Server server = Server.getServer();
Mysql mysql = server.mysql;
password = EncryptionUtils.MD5Hash(password);
mysql.openMysqlConnection();
MySqlCommand commandsql = new MySqlCommand("SELECT * FROM users WHERE username = '" + cmsg.username + "'", mysql.con);
MySqlDataReader MyReader = commandsql.ExecuteReader();
string activated = "";
string mpassword = "";
string muser = "";
if (MyReader.Read())
{
activated = MyReader["confirmed"].ToString();
mpassword = MyReader["password"].ToString();
muser = MyReader["username"].ToString();
}
MyReader.Close();
if (mpassword != cmsg.password || cmsg.username != muser)
{
server.sendToPlayer(new NMSG_ConnectionMessage(cmsg.username,false,false), server.reliableChannel, connectionId);
return;
}
if (server.users.ContainsKey(connectionId))
server.users[connectionId].setName(muser);
else
return;
if (activated == "False")
{
server.sendToPlayer(new NMSG_ConnectionMessage(cmsg.username,false,true), server.reliableChannel, connectionId);
return;
}
server.users[connectionId].pData = new PlayerData(cmsg.username);
server.users[connectionId].isAuth = true;
server.sendToPlayer(new NMSG_ConnectionMessage(cmsg.username,true,false), server.reliableChannel, connectionId);
}
}
Заранее спасибо за вашу помощь
DataContractJsonSerializer
используется средство чтения, возвращенноеJsonReaderWriterFactory.CreateJsonReader()
, которое фактически наследуется отXmlReader
и на лету переводит из JSON в XML. По-видимому, это было сделано для того, чтобы код десериализации Microsoft JSON мог повторно использовать как можно больше из десериализации контракта данных XML. Так что вполне возможно, что ОП может получить здесьXmlException
. - person dbc   schedule 07.08.2019recBuffer
содержит то же содержимое, что иbuffer
при отправке? Кроме того, это вопрос unity3d? - person dbc   schedule 07.08.2019NMSG_ConnectAccount
иNMSG
как на клиенте, так и на сервере? Если да, то находятся ли они в какой-то общей DLL, используемой обоими, или копируются локально в каждую из них? - person dbc   schedule 08.08.2019