Почему возникает исключение во время десериализации 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/.

Джон Скит продемонстрировал, что причиной проблемы был способ импорта внешних прототипов. Правильный способ сделать это не очевиден или четко задокументирован.

Другие вопросы по тегам