我在设置请求流类型 gRPC 架构时遇到一些问题。下面的代码仅用于测试目的,缺少各种验证检查,但主要问题是原始文件始终小于收到的文件。
这里的原因可能是编码吗?无论文件类型是什么,最终结果总是文件大小不同。
Protobuf接口:
syntax = "proto3";
package FileTransfer;
option csharp_namespace = "FileTransferProto";
service FileTransferService {
rpc DownloadFile(FileRequest) returns (stream ChunkMsg);
}
message ChunkMsg {
string FileName = 1;
int64 FileSize = 2;
bytes Chunk = 3;
}
message FileRequest {
string FilePath = 1;
}
Run Code Online (Sandbox Code Playgroud)
服务器端(发送):
public override async Task DownloadFile(FileRequest request, IServerStreamWriter<ChunkMsg> responseStream, ServerCallContext context)
{
string filePath = request.FilePath;
if (!File.Exists(filePath)) { return; }
FileInfo fileInfo = new FileInfo(filePath);
ChunkMsg chunk = new ChunkMsg();
chunk.FileName …Run Code Online (Sandbox Code Playgroud) 我在 .NET Core 服务器上使用 protobuf-net.Grpc 并尝试从 .NET Framework (4.7.2.) gRPC 客户端进行调用。完整的示例在这里: https: //github.com/angelagyang/GRPCProtobufExample
这是我的客户的片段:
var channelCreds = new SslCredentials(GetRootCertificates());
var channel = new Channel("localhost", 5001, channelCreds);
var greeter = channel.CreateGrpcService<IGreeterService>();
Run Code Online (Sandbox Code Playgroud)
StatusCode="Unknown", Detail="Stream removed"...使用此配置,我在调用服务器时收到错误。如果我在服务器上设置,我就可以连接到服务器ClientCertificateMode = ClientCertificateMode.NoCertificate。但是,我希望服务器需要客户端证书并通过指纹验证证书。
例如,在 .NET Core 中,我可以使用 Grpc.Net.Client 来配置我的通道,如下所示:
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
var channel2 = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
HttpHandler = handler
});
Run Code Online (Sandbox Code Playgroud)
有没有办法像这样在 .NET Framework 中配置带有证书的客户端?我对 gRPC/.NET 还很陌生,非常感谢任何建议!
我在我的项目中使用Protobuf并Dotner Core 3.1安装这个包,但是当我编写这些代码行来序列化请求的对象时:
public static byte[] ProtoSerialize<T>(T record) where T : class
{
try
{
using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, record);
return stream.ToArray();
}
}
catch
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
Visual studio找不到相关的名称空间并出现找不到的错误Serializer,
当前上下文中不存在名称“Serializer”
我对其进行了测试.Net并安装了有效的相关软件包,但.Net Core出现了错误。有什么关系namespece?问题是什么?
我正在将 protobuf-net v2 beta r431 用于 C# .net 4.0 应用程序。在我的应用程序中Dictionary<int, IMyClass>,我需要序列化一个。一个类MyClass实现IMyClass接口。根据 protobuf 的文档,我编写的代码如下:
[ProtoContract]
[ProtoInclude(1, typeof(MyClass))]
public interface IMyClass
{
int GetId();
string GetName();
}
[ProtoContract]
[Serializable]
public class MyClass : IMyClass
{
[ProtoMember(1)]
private int m_id = 0;
[ProtoMember(2)]
private string m_name = string.Empty;
public MyClass(int id, string name)
{
m_id = id;
m_name = name;
}
public MyClass()
{
}
#region IMyClass Members
public int GetId()
{
return m_id;
}
public string …Run Code Online (Sandbox Code Playgroud) 有人知道为接口设置ProtoContract的正确方法是什么吗?
我得到以下异常“一旦生成序列化程序,就无法更改类型”,仅使用属性。
使用的代码:
[ProtoContract]
public class Lesson5TestClass2 : ILesson5TestInteface1
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public string Phone { get; set; }
}
[ProtoContract]
[ProtoInclude(1000, typeof(Lesson5TestClass2))]
public interface ILesson5TestInteface1
{
[ProtoMember(1)]
string Name { get; set; }
[ProtoMember(2)]
string Phone { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
只有添加以下设置,我才能反序列化:
RuntimeTypeModel.Default.Add(typeof (ILesson5TestInteface1), true)
.AddSubType(50, typeof(Lesson5TestClass2));
Run Code Online (Sandbox Code Playgroud)
我真的很想只使用属性来配置它。
我正在使用 NuGet 的 protobuf-net r470。
顺便说一句:这个例子来自一组“通过测试的教训”,展示了如何为我的同事使用 protobuf-net 进行序列化。
谢谢阅读 :)
package tutorial;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
Run Code Online (Sandbox Code Playgroud)
“1”、“2”、“3”是什么意思?
我在使用从泛型类继承的对象的子类的 ProtoBuf-Net 时遇到了一些问题。
我的继承树看起来像这样:
Node
SomeNodeType
SomeOtherType
ResourceNode<T>
ShipResource : ResourceNode<Ship>
SomeResource : ResourceNode<SomeType>
Run Code Online (Sandbox Code Playgroud)
我一直在所有普通类型的基本 Node 类型上使用 ProtoInclude。
使用 protobuf-net 实现这种层次结构的最佳方法是什么?我试过只包含所有内容,但我得到的错误似乎源于 protobuf 试图将对象反序列化为它的父对象之一。
灵感来自这个问题.我创建了一个小的基准程序来比较ProtoBuf,BinaryFormatter和Json.NET.基准测试本身是一个基于控制台的小型控制台,位于https://github.com/sidshetye/SerializersCompare.可以随意添加/改进,添加新的串行器非常简单.无论如何,我的结果是:
Binary Formatter ProtoBuf Json.NET ServiceStackJson ServiceStackJSV
Loop Size:512 bytes Size:99 bytes Size:205 bytes Size:205 bytes Size:181 bytes
1 16.1242 ms 151.6354 ms 277.2085 ms 129.8321 ms 146.3547 ms
2 0.0673 ms 0.0349 ms 0.0727 ms 0.0343 ms 0.0370 ms
4 0.0292 ms 0.0085 ms 0.0303 ms 0.0145 ms 0.0148 ms
8 0.0255 ms 0.0069 ms 0.0017 ms 0.0216 ms 0.0129 ms
16 0.0011 ms 0.0064 ms 0.0282 ms 0.0114 ms 0.0120 ms
32 0.0164 ms …Run Code Online (Sandbox Code Playgroud) 我正在使用Spyder与Keras一起做一些小项目,并且时不时地(我没有弄清楚使它出现的代码是什么)我得到了以下消息:
File "~/.local/lib/python3.5/site-packages/google/protobuf/descriptor_pb2.py", line 1771, in <module>
__module__ = 'google.protobuf.descriptor_pb2'
TypeError: A Message class can only inherit from Message
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我使用终端在Spyder之外执行程序,则不会引发此异常。我环顾四周,发现没有人在使用Keras时遇到此错误。
重新启动Spyder会使它消失,但令人沮丧。是什么原因造成的?
我需要存储大数据(以千兆字节为单位)以使用 protobuf-net 2.4.0 进行流式传输。
目前,我使用的策略是使用 PrefixStyle.Base128 编写带有 LengthPrefix 的小标头,并使用以下代码使用标准 protobuf 序列化方法编写大主体,它的工作原理非常神奇。
private void Serialize(Stream stream)
{
Model.SerializeWithLengthPrefix(stream, FileHeader, typeof(FileHeader), PrefixStyle.Base128, 1);
if (FileHeader.SerializationMode == serializationType.Compressed)
{
using (var gzip = new GZipStream(stream, CompressionMode.Compress, true))
using (var bs = new BufferedStream(gzip, GZIP_BUFFER_SIZE))
{
Model.Serialize(bs, FileBody);
}
}
else
Model.Serialize(stream, FileBody);
}
Run Code Online (Sandbox Code Playgroud)
现在我需要将主体拆分为 2 个不同的对象,因此我也必须对它们使用 LengthPrefix 方法,但我不知道在这种情况下最好的PrefixStyle是什么。我可以继续使用Base128吗?Fix32描述中的“对兼容性有用”是什么意思?
更新
我发现这篇文章Marc Gravell 解释说可以选择使用开始标记和结束标记,但我不确定它是否可以与 LengthPrefix方法一起使用。更清楚地说,下面代码中显示的方法是否有效?
[ProtoContract]
public class FileHeader
{
[ProtoMember(1)]
public int Version { …Run Code Online (Sandbox Code Playgroud)