У меня есть клиент-серверное приложение, в котором я хочу отправить зашифрованный объект с сервера клиенту.
Клиент отправляет серверу запрос, например:
byte[] encryptedResponse = authenticationService.SendRequest(sessionId, requestData);
Затем клиент получает зашифрованный массив байтов ответа. Затем он звонит
byte[] clearResponse = Cryptography.DecryptSymmetric(key, iv, encryptedResponse);
В clearResponse теперь есть очищенный двоично-сериализованный объект с сервера.
Клиент и сервер совместно используют интерфейсную библиотеку, которая содержит интерфейс IUser, который выглядит так:
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
Дополнительная информация: Сборка «Пользователи, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null» не может быть найдена.
Как я могу десериализовать тип, в котором я знаю только интерфейс?