protobuf-net.Grpc сериализующие интерфейсы

Я столкнулся с некоторыми трудностями при сериализации интерфейса с помощью CodeFirst в Protobuf-net.grpc. Это DataMember внутри DataContract. Он отлично работает, когда я использую его в простом консольном приложении, но когда я пытаюсь использовать его в другом проекте с теми же ссылками, он не сериализуется. Я также вижу эту ошибку в выводе Visual Studio, когда AddCodeFirst выполняется на сервере gRPC:

Возникло исключение: «System.InvalidOperationException» в protobuf-net.dll

Это код, который у меня есть для DataContract как в моем проекте, так и в фиктивном приложении.

      using ProtoBuf;

namespace ProtoBufTesting.Prepare
{
    [DataContract, ProtoContract]
    public class ExtensionData
    {
        public ExtensionData() { }

        public ExtensionData(
            string extensionName,
            string packageIdentifier,
IExtensionCertificateCollection collection)
        {
            this.ServiceName = extensionName;
            this.PackageIdentifier = packageIdentifier;
            this.CertificateCollection = collection;
        }

        [DataMember]
        [ProtoMember(1)]
        public string ServiceName
        {
            get; private set;
        }

        [DataMember]
        [ProtoMember(4)]

        public string PackageIdentifier
        {
            get; private set;
        }

        [DataMember]
        [ProtoMember(5)]

        public IExtensionCertificateCollection CertificateCollection { get; private set; }
    }
}

Это интерфейс IExtensionCertificateCollection с декоратором ProtoContract, который работает в моем примере проекта.

      namespace ProtoBufTesting
{
    [ProtoContract]
    public interface IExtensionCertificateCollection
    {

        IExtensionCertificate GetByThumbprint(string thumbprint);

        IEnumerable<IExtensionCertificate> AllCertificates { get; }
    }
}

Это сервисный контракт, который использует ExtensionData DataContract.

      [ServiceContract(Namespace = "blah")]
public interface IRTC
{

    [OperationContract]
    ExtensionData PrepareExtension(PrepareExtensionInput input);

}

Вот как я выполняю настройку Code First, если вы видите ниже. Это отлично работает, кроме как во втором проекте, где я делаю то же самое. Я действительно не уверен, как это отлаживать. Причина, по которой я сделал пример консольного приложения, заключается в том, чтобы проверить, сериализуются ли интерфейсы с помощью декораторов ProtoContract, и они успешно справились с этим декоратором ProtoContract... Но когда я начал использовать его в более крупном проекте (то же самое определение интерфейса и контракт данных), он просто похоже, не сериализует DataContract. Он только сериализует DataContract, когда я удаляю этот интерфейс из Datamember. Любые идеи, как мне отладить это, чтобы выяснить, что вызывает это? Я застрял на этом несколько часов. Кроме InvalidOperationException, я не вижу других ошибок в выводе VS.

      Server server = new Server
            {
                Ports = { new ServerPort("localhost", ServerPort.PickUnused , ServerCredentials.Insecure) }
            };

            server.Services.AddCodeFirst(new RTC());
            server.Start();
            int port = server.Ports.Single().BoundPort;

            Console.WriteLine("server listening on port " + port);

            GrpcClientFactory.AllowUnencryptedHttp2 = true;

            Channel channel = new Channel("localhost", port, ChannelCredentials.Insecure);
            

            var rtc = channel.CreateGrpcService<IRTC>();

Обновлять:

Я нашел другой способ "отладки" этого - используя этот метод ниже. Он проанализировал схему объекта, который я пытаюсь сериализовать. Попытка поймать этот конкретный объект выдала мне как минимум ошибку! «Теги должны быть целыми положительными числами». Я нашел эту проблему и исправил ее.

      ProtoBuf.Meta.RuntimeTypeModel.Default.GetSchema(typeof(ExtensionData));

Но после этой ошибки я все еще продолжаю получать предыдущую картинку, и это, похоже, не решает. Я запускаю это с помощью метода модульного тестирования, и он показывает только ошибку высокого уровня, подобную этой, во время AddCodeFirst - я добавил TraceWriter в AddCodeFirst, и вот что он говорит:

      [warning] Type cannot be serialized; ignoring: ExtensionData
[warning] Signature not recognized for PrepareExtension; method will not be bound

Как мне продолжить расследование этого дела? Это связано с предыдущей ошибкой, которую я все еще получаю:

Возникло исключение: «System.InvalidOperationException» в protobuf-net.dll

0 ответов

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