反序列化接口类型



我有一个client - server - application,我想从服务器向客户端发送一个加密的对象。

客户端向服务器发送如下请求:

byte[] encryptedResponse = authenticationService.SendRequest(sessionId, requestData);

客户端得到一个加密的响应字节数组。然后他调用

byte[] clearResponse = Cryptography.DecryptSymmetric(key, iv, encryptedResponse);

In clearResponse现在是来自服务器的明确的二进制序列化对象。

客户端和服务器共享一个接口库,其中包含IUser-Interface,看起来像:

public interface IUser : ISerializable
{
   Guid UserId { get; }
   string Username { get; }
} 

服务器包含这个接口的实现,看起来像:

[Serializable]
    internal class User : IUser
    {
        public User(){}
        public User(SerializationInfo info, StreamingContext context)
        {
            Id = Guid.Parse(info.GetString(XmlNodes.UserId));
            Username = info.GetString(XmlNodes.Username);
        }
        public Guid Id { get; set; }
        public string Username { get; set; }
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue(XmlNodes.UserId, Id.ToString());
            info.AddValue(XmlNodes.Username, Username);            
        }
    }

服务器使用以下代码为客户端序列化用户:

byte[] responseData;
IUser user = new User { Id = Guid.NewGuid(), Username = "Dummy" };
using(MemoryStream memoryStream = new MemoryStream())
{
  BinaryFormatter binaryFormatter = new BinaryFormatter();
  binaryFormatter.Serialize(memoryStream, user);
  responseData = memoryStream.ToArray();
}
// encrypt the responseData and send it to the client.

如果我用

反序列化用户
using(MemoryStream memoryStream = new MemoryStream(clearResponse))
{
  BinaryFormatter binaryFormatter = new BinaryFormatter();
  IUser user = (IUser)binaryFormatter.Deserialize(memoryStream)
}

我得到一个异常。

类型的未处理异常"System.Runtime.Serialization。SerializationException'发生在mscorlib.dll

附加信息:程序集"Users, Version=1.0.0.0,文化=中性,PublicKeyToken=null"无法找到。

我如何在只知道接口的情况下反序列化类型?

使用BinaryFormatter您不能,因为类型是数据的一部分。

您可以使用XmlSerializer并将结果string作为(可能加密的)byte[]发送到客户端。然后客户端只需要一个"兼容类型"来反序列化它。

如果你想坚持使用BinaryFormatter,你也可以将User类型移动到一个共享库(如果还没有),并通过服务器和客户端引用它。

相关内容

  • 没有找到相关文章

最新更新