标签: protobuf-net

C# gRPC 文件流式传输,原始文件比流式文件小

我在设置请求流类型 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)

c# stream protobuf-net grpc

6
推荐指数
2
解决办法
6479
查看次数

如何将 .NET 框架中的 gRPC 客户端与安全的 .NET Core 服务器连接?

我在 .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 还很陌生,非常感谢任何建议!

.net c# protobuf-net .net-core grpc

6
推荐指数
1
解决办法
7131
查看次数

.net core ProtoBuf 上的 Serializer 在哪里?

我在我的项目中使用ProtobufDotner 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?问题是什么?

c# protobuf-net .net-core

6
推荐指数
1
解决办法
1688
查看次数

protobuf-net 的 [ProtoInclude(1, "MyClass")] 不起作用

我正在将 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)

c# protobuf-net

5
推荐指数
2
解决办法
1658
查看次数

与 protobuf-net 和 C# 的接口

有人知道为接口设置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 进行序列化。

谢谢阅读 :)

.net c# protobuf-net

5
推荐指数
1
解决办法
5006
查看次数

protobuf 中的“1”、“2”、“3”是什么意思?

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”是什么意思?

protocol-buffers protobuf-net

5
推荐指数
2
解决办法
1574
查看次数

ProtoBuf-Net ProtoInclude 泛型类型子类

我在使用从泛型类继承的对象的子类的 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-net

5
推荐指数
1
解决办法
4530
查看次数

为什么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)

protocol-buffers protobuf-net

5
推荐指数
1
解决办法
2586
查看次数

Keras和Spyder的奇怪错误

我正在使用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会使它消失,但令人沮丧。是什么原因造成的?

python protobuf-net spyder keras

5
推荐指数
0
解决办法
2012
查看次数

对于大文件来说,ProtoBuf-net 的最佳 PrefixStyle 是什么?

我需要存储大数据(以千兆字节为单位)以使用 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)

c# protobuf-net

5
推荐指数
1
解决办法
188
查看次数

标签 统计

protobuf-net ×10

c# ×6

.net ×2

.net-core ×2

grpc ×2

protocol-buffers ×2

keras ×1

python ×1

spyder ×1

stream ×1