Я сериализую многие объекты и записываю их в поток, а затем десериализую эти объекты из потока с помощью Protobuf.net.
тип объекта определяется во время выполнения, поэтому я должен использовать метод NonGeneric «TryDeserializeWithLengthPrefix».
Я продолжаю получать исключение «Недопустимое поле в исходных данных: 0». Но когда я использую общий метод DeserializeWithLengthPrefix(), он работает нормально.
И очень странно, сначала я получаю «Недопустимое поле в исходных данных: 0», но когда я изменил длину массива, я начинаю получать «System.InvalidOperationException»! Первое исключение возникает только тогда, когда длина равна 5 или 9. Я пробовал использовать класс вместо int[], но результат тот же.
ниже приведен тестовый код, большое спасибо за помощь.
MemoryStream outputStream = new MemoryStream();
MemoryStream inputStream;
for (int i = 0; i < 10; i++)
{
//an int array as the object to serialize
var data = new int[] { 1, 2, 3, 4, 5 };
Serializer.SerializeWithLengthPrefix(outputStream, data, PrefixStyle.Base128);
}
var dataBytes = outputStream.ToArray();
inputStream = new MemoryStream(dataBytes);
while (inputStream.Position != inputStream.Length)
{
object output;
//not working, "System.InvalidOperationException" or "Invalid field in source data: 0" depend on the lenth of the array
Serializer.NonGeneric.TryDeserializeWithLengthPrefix(inputStream, PrefixStyle.Base128, t => typeof(int[]), out output);
//working! every time
var output = Serializer.DeserializeWithLengthPrefix<int[]>(inputStream, PrefixStyle.Base128);
foreach (var num in (int[])output)
{
Console.WriteLine(num);
}
}