C# Protobuf网络错误:类型不应为,并且无法推断任何约定:System.Data.DataTable

C# Protobuf网络错误:类型不应为,并且无法推断任何约定:System.Data.DataTable,c#,grpc,protobuf-net,serialization,C#,Grpc,Protobuf Net,Serialization,我需要序列化我在运行时使用ProBuf.Serializer创建的datatable,ProBuf.Serializer在protobuf net Nuget下可用。下面附上我使用过的代码示例。我犯了一个错误 ProtoBuf.serializer.Serialize(流、表);有人能帮我解决这个问题吗 public static void Main() { try { Process process = new Process()

我需要序列化我在运行时使用ProBuf.Serializer创建的datatable,ProBuf.Serializer在protobuf net Nuget下可用。下面附上我使用过的代码示例。我犯了一个错误 ProtoBuf.serializer.Serialize(流、表);有人能帮我解决这个问题吗

public static void Main()
    {
        try
        {
            Process process = new Process();
            process.StartInfo.FileName = @"E:\POC\Test\GrpcServer\bin\Debug\netcoreapp3.0\GrpcServer.exe";
            process.Start();
            List<ChannelOption> channelOptions = new List<ChannelOption>()
            {
                new ChannelOption(ChannelOptions.MaxSendMessageLength, int.MaxValue)
            };
            Channel channel = new Channel("localhost:5005", ChannelCredentials.Insecure, channelOptions);
            var client = new TestingService.TestingServiceClient(channel);
            DataTable table = CreateTable(100000);
            Console.WriteLine("Starting Serialization");
            DateTime serializationStartTime = DateTime.Now;

            MemoryStream stream = new MemoryStream();
            ProtoBuf.Serializer.Serialize(stream, table);
            stream.Seek(0, SeekOrigin.Begin);
            DateTime serializationEndTime = DateTime.Now;
            byte[] arr = stream.ToArray();
            ByteString data = ByteString.CopyFrom(arr);
            Console.WriteLine("Completed Serialization");
            Console.WriteLine("Started Communication with Grpc Server");
            DateTime startGrpcTime = DateTime.Now;
            client.RecieveData(new PBData() { Data = data });
            DateTime endGrpcTime = DateTime.Now;
            Console.WriteLine("Grpc communication ended");
            Console.WriteLine($"Serialization time :{(serializationEndTime - serializationStartTime).TotalSeconds}");
            Console.WriteLine($"Grpc Communication time :{(endGrpcTime - startGrpcTime).TotalSeconds}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error:{ex.Message}");
        }
    }`
publicstaticvoidmain()
{
尝试
{
流程=新流程();
process.StartInfo.FileName=@“E:\POC\Test\GrpcServer\bin\Debug\netcoreapp3.0\GrpcServer.exe”;
process.Start();
列表通道选项=新列表()
{
新的ChannelOption(ChannelOptions.MaxSendMessageLength,int.MaxValue)
};
通道通道=新通道(“本地主机:5005”,通道凭据。不安全,通道选项);
var client=新的TestingService.TestingServiceClient(通道);
DataTable=CreateTable(100000);
Console.WriteLine(“开始序列化”);
DateTime serializationStartTime=DateTime.Now;
MemoryStream stream=新的MemoryStream();
ProtoBuf.Serializer.Serialize(流、表);
stream.Seek(0,SeekOrigin.Begin);
DateTime serializationEndTime=DateTime.Now;
字节[]arr=stream.ToArray();
ByteString数据=ByteString.CopyFrom(arr);
Console.WriteLine(“已完成序列化”);
Console.WriteLine(“已开始与Grpc服务器通信”);
DateTime startGrpcTime=DateTime.Now;
receiveData(新的PBData(){Data=Data});
DateTime endGrpcTime=DateTime.Now;
控制台写入线(“Grpc通信结束”);
WriteLine($“序列化时间:{(serializationEndTime-serializationStartTime).TotalSeconds}”);
WriteLine($“Grpc通信时间:{(endGrpcTime-startGrpcTime.TotalSeconds}”);
}
捕获(例外情况除外)
{
WriteLine($“错误:{ex.Message}”);
}
}`

编辑:下面的许多答案假设您正在使用protobuf-net.Grpc;在重读这篇文章时,这可能不是一个有效的假设——尽管它在你的情况下会很好地工作!但是:在您的情况下,也许一个更简单的解决方案就是将代码替换为:

DataTable=CreateTable(100000);
Console.WriteLine(“开始序列化”);
DateTime serializationStartTime=DateTime.Now;
MemoryStream stream=新的MemoryStream();
table.RemotingFormat=RemotingFormat.Binary;
表.WriteXml(流);
stream.Seek(0,SeekOrigin.Begin);//实际上不需要,注意
DateTime serializationEndTime=DateTime.Now;
字节[]arr=stream.ToArray();
ByteString数据=ByteString.CopyFrom(arr);
Console.WriteLine(“已完成序列化”);

(当图书馆的作者说“这可能不是你的最佳选择”,你可能应该在发布我的答案后听听,我无意中发现了这个:-注意:这不是我的代码-我从来没有使用过它,评估过它,审查过它,或者其他任何东西-所以它不是一个官方建议:但是:粗略地看一下,它看起来可能会做你想做的事情!谢谢你的帮助,马克。你能告诉我,是吗e是否有任何方法可以发送较大的数据表,例如行数为1000万的表,并在最短的时间内序列化并发送到grpc服务器。您是否知道如何在最短的时间内在客户端和服务器之间发送大量数据?@SankarSai“发送较少的数据”通常对我有效……但是:我不确定这里的具体问题是什么?当然,像protobuf这样的二进制编码在这方面非常好,但是如果您发送非常大的有效负载,您可能希望在gRPC中使用流式传输,成批发送数据(例如,每批1k或10k行,而不是单个行);如果使用protobuf-net.Grpc:这意味着使用
IAsyncEnumerable