Почему возникает исключение во время десериализации JSON известных типов protobuf3?
Использование пакета Nuget Google.Protobuf версии 3.4.1
В простейшей форме у меня есть сообщение буфера протокола Google, определенное так:
syntax = "proto3";
package tests;
option csharp_namespace = "MyTests";
import "wrappers.proto";
message Foo {
.google.protobuf.Int32Value NullableInt = 1;
}
Я компилирую его в код C#, используя инструмент Protoc Google из Google.Protobuf.Tools версии 3.4.0.
Когда я создаю экземпляр экземпляра Foo и сериализую его в строку, используя Google.Protobuf.JsonFormatter, я получаю ощутимый результат: "{ "NullableInt": 5 }". Когда я возвращаю сериализацию обратно в экземпляр Foo с помощью Google.Protobuf.JsonParser, синтаксический анализатор создает исключение System.InvalidCastException, в котором говорится, что "Невозможно привести объект типа" System.Int32 "к типу" Google.Protobuf.WellKnownTypes.Int32Value ". "
Почему выбрасывается это исключение? Я делаю что-то глупое?
Вот код, который я запускаю:
[Test]
public void TestRoundTripInt32Value()
{
var foramtter = new JsonFormatter(new JsonFormatter.Settings(false));
var foo = new Foo { NullableInt = new Int32Value {Value = 5} };
var str = foramtter.Format(foo);
Console.WriteLine(str);
var parser = new JsonParser(new JsonParser.Settings(100));
var foo2 = parser.Parse<Foo>(str); // <= Throws!
Assert.That(foo2, Is.EqualTo(foo));
}
1 ответ
См. https://groups.google.com/forum/.
Джон Скит продемонстрировал, что причиной проблемы был способ импорта внешних прототипов. Правильный способ сделать это не очевиден или четко задокументирован.