反序列化接口类型

时间:2014-05-13 11:24:05

标签: c# serialization binaryformatter

我有一个Client-Server-Application,我希望将加密对象从服务器发送到客户端。

客户端正在向服务器发送请求,如:

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

然后客户端获得一个加密的响应字节数组。然后他打电话给

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

在clearResponse中,现在是来自服务器的清晰的二进制序列化对象。

客户端和服务器共享一个Interface-Library,其中包含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,   无法找到Culture = neutral,PublicKeyToken = null“。

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

1 个答案:

答案 0 :(得分:1)

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

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

如果您想坚持BinaryFormatter,您还可以将User类型移动到共享库(如果尚未),并由服务器和客户端引用它。