Первоначальная проблема заключается в том, что вы повредили данные, используя Encoding
в обратном направлении. Encoding
преобразует произвольный текст в отформатированный двоичный файл (что означает: отформатированный в соответствии с правилами этого «кодирования») и отформатированный двоичный файл обратно в произвольный текст. Он предназначен для описания того, как записать текст в поток. Вы использовали его задом наперед, что означает: вы использовали его для преобразования произвольного двоичного файла в другом формате в строку. Возможно, вы также использовали два разных кодирования (StreamReader
почти наверняка не будет использовать ASCII по умолчанию).
Итак: вы не можете использовать Encoding
здесь. То, что вы можете использовать - это base-64; например:
using (var outputStream = new MemoryStream())
{
Serializer.Serialize<T>(outputStream, data);
return Convert.ToBase64String(outputStream.GetBuffer(),
0, (int)outputStream.Length);
}
Вы можете изменить это, используя Convert.FromBase64String
:
using (var ms = new System.IO.MemoryStream(Convert.FromBase64String(encoded)))
{
object ob = Deserialize(ms);
Console.WriteLine(ob.ToString());
}
Существует также проблема, когда вы дважды десериализуете поток без перемотки, что означает, что вторая десериализация работает с нулевыми байтами, что означает, что будет пытаться создать экземпляр абстрактного типа; поэтому вам также необходимо исправить метод Deserialize
:
public static object Deserialize(Stream data)
{
AbstractTest test = Serializer.Deserialize<AbstractTest>(data);
return test;
}
После этого все работает правильно.