C#序列化-相同的输入会产生完全不同的结果?

时间:2018-08-12 03:17:31

标签: c# networking serialization

我的程序正在序列化一个类,并正在通过网络发送它,并在另一端被接收。当接收服务器获取字节数组并尝试对其进行反序列化时,它将导致错误。当我尝试将原始发送的数据与服务器上的新生成的数据进行比较时(使用同一类上的相同函数,例如:尝试查看服务器上的同一函数是否产生相同的结果),结果是完全不同的。 这怎么可能?

我似乎无法弄清楚。

public static byte[] ObjectToByteArray(object obj)
    {
        if (obj == null)
            return null;

        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }

    private static Object ByteArrayToObject(byte[] arrBytes)
    {
        MemoryStream memStream = new MemoryStream();
        BinaryFormatter binForm = new BinaryFormatter();
        memStream.Write(arrBytes, 0, arrBytes.Length);
        memStream.Seek(0, SeekOrigin.Begin);
        Object obj = binForm.Deserialize(memStream);
        return obj;
    }

这是我用于序列化的类:

[Serializable]
public class NetworkObject
{
    public NetObjectType requestType;

    public NetworkObject(NetObjectType type)
    {
        requestType = type;
    }
}

编辑: 这是引发的错误:

  在System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()处的

     在System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo,字符串名称)      在System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor处(String objectName,String [] memberNames,BinaryTypeEnum [] binaryTypeEnumA,Object [] typeInformationA,Int32 [] memberAssemIds,ObjectReader objectReader,Int32 objectId,BinaryAssemblyInfo AssemblyInfo,TableizedToTable )      在System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped记录)处      在System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)中      在System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run()处      在System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize处(HeaderHandler处理程序,__ BinaryParser serParser,布尔值fCheck,布尔值isCrossAppDomain,IMethodCallMessage methodCallMessage)      在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize处(流serializationStream,HeaderHandler处理程序,布尔fCheck,布尔isCrossAppDomain,IMethodCallMessage methodCallMessage)      在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)处      在X:\ Programming \ VS \ matchmake .net \ matchmaker.net \ matchmaker.net \ Matchmaker \ Network \ SocketManager.cs:line 220中的Matchmaker.Net.Network.SocketManager.ByteArrayToObject(Byte [] arrBytes)      在X:\ Programming \ VS \ matchmake .net \ matchmaker.net \ matchmaker.net \ Matchmaker \ Network \ SocketManager.cs:line 126中的Matchmaker.Net.Network.SocketManager.readAsyncBytes(IAsyncResult result)中

此外,NetObjectType的内容:

    public enum NetObjectType
{
    CLIENT_REQUEST_SERVER_LIST,
    CLIENT_SERVER_RESPONSE_GENERIC,
    CLIENT_SERVER_REGISTER_SERVER,
    CLIENT_SERVER_UNREGISTER_SERVER,
    CLIENT_SERVER_MODIFY_REGISTERED_SERVER,
    SERVER_SEND_MATCHMAKE
}

1 个答案:

答案 0 :(得分:0)

在公共程序集中实现可序列化的类,该类应由客户端和服务器使用,或使用SerializationBinder来解决由不同名称空间等引起的问题。

This article is useful