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