标签: protobuf-net

Protobuf-net 泛型继承和封闭构造泛型类型

我有一个相当复杂的继承层次结构,包括泛型,我们正在尝试使用 protobuf .net 进行序列化。不幸的是,它似乎无法正确处理这种情况。这就是层次结构的样子。

    [System.Runtime.Serialization.DataContract]
    [ProtoBuf.ProtoInclude(1000, typeof(GenericBaseClass<object>))]
    [ProtoBuf.ProtoInclude(1001, typeof(GenericBaseClass<string>))]
    public abstract class BaseClass
    {

        public int BaseProperty1 { set; get; }
        public int BaseProperty2 { set; get; }

        public BaseClass()
        {

        }

    }

    [System.Runtime.Serialization.DataContract]
    [ProtoBuf.ProtoInclude(1002, typeof(GenericDerivedClass<object>))]
    [ProtoBuf.ProtoInclude(1003, typeof(GenericDerivedClass<string>))]
    public abstract class GenericBaseClass<T> : BaseClass
    {
        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.DataMember(Order = 5)]
        public T ResponseProperty
        {
            get;
            set;
        }

        public GenericBaseClass()
        {
        }
    }

    [System.Runtime.Serialization.DataContract]
    [ProtoBuf.ProtoInclude(1004, typeof(DerivedClass1))]
    [ProtoBuf.ProtoInclude(1005, typeof(DerivedClass2))]
    public abstract class GenericDerivedClass<T> : GenericBaseClass<T>
    {
        public int AdditionalProperty …
Run Code Online (Sandbox Code Playgroud)

protobuf-net

3
推荐指数
1
解决办法
3291
查看次数

Grpc.Core.RpcException“无法反序列化响应消息..”或“InvalidOperationException:长度不匹配”

我正在 .NET Core 3.1 上运行 gRPC 服务,并尝试从 .NET Framework 4.7.2 客户端进行调用。我正在使用 protobuf-net 来重用现有的 WCF 数据契约。今天,当响应对象的字段之一不为空时,我注意到以下意外的客户端行为。

Grpc.Core.RpcException: 'Status(StatusCode="Internal", Detail="Failed to deserialize response message.")

  • 软件包:protobuf-net v2.4.4、Grpc v2.30.0、protobuf-net.Grpc v1.0.90、protobuf-net.Grpc.Native v1.0.90、Google.Protobuf v3.12.2

下面是一个示例,说明了数据契约的一般结构 - 在本例中,Response<PersonData>是响应,PersonDataList是非空字段。

   [DataContract]  
   public class Response<TValue>{
         [DataMember(Order = 1)]
         public TValue Value; 
    }

   [DataContract]  
   public class PersonData : Data {
         [DataMember(Order = 1)]
         public IList<PersonDataItem> PersonDataList; 
    }
    
    [DataContract]
    public PersonDataItem {
         [DataMember(Order = 1)] 
         public PersonDataType Type {get; private set;}
    
         [DataMember(Order = 2)] 
         public DateTime? …
Run Code Online (Sandbox Code Playgroud)

c# protobuf-net grpc

3
推荐指数
1
解决办法
5331
查看次数

限制protobuf中的字符串长度?

我正在尝试对 protobuf 消息实施限制,这些消息可以在使用不同语言的不同客户端之间共享

除此之外,我想对字符串长度实施限制,例如最小或最大长度,或者 int32 var 的最小和最大值范围

有没有办法实现这样的要求?非常感谢你的帮助!

protocol-buffers protobuf-net protobuf-csharp-port

3
推荐指数
1
解决办法
3912
查看次数

protobuf-net不反序列化0

我使用C#protobuf网r278,我只是注意到,如果我有一个类int字段,字段不正确,如果它的值设置为0,即反序列化,反序列化时,它会从它的默认值类定义.示例类:

[ProtoBuf.ProtoContract]
public class
Test
{
    [ProtoBuf.ProtoMember(1)]
    public int Field1 = -1

    [ProtoBuf.ProtoMember(2)]
    public int Field2 = -1;
}
Run Code Online (Sandbox Code Playgroud)

然后运行以下代码:

var test = new Test();
test.Field1 = 0;
test.Field2 = 0;
MemoryStream ms_out = new MemoryStream();
ProtoBuf.Serializer.Serialize(ms_out, test);
ms_out.Seek(0, SeekOrigin.Begin);
var deser = ProtoBuf.Serializer.Deserialize<Test>(ms_out);
Run Code Online (Sandbox Code Playgroud)

当我这样做,deserField1 = -1Field2 = 2,而不是0.我在这里做错了吗?

c# protobuf-net

2
推荐指数
1
解决办法
913
查看次数

在Proto-Buf中使用bool类型

我在我的应用程序中使用protobuf-net进行序列化/反序列化.我正面临一个问题.

[ProtoContract()]
ClsTest
{
    private bool _isPeriodic

    [ProtoMember(1)]
    public bool IsPeriodic
    {
        get
        {
             return _isPeriodic;
        }

        set
        {
            isPeriodic = value;
        }
   }

}
Run Code Online (Sandbox Code Playgroud)

我在我的collction对象中使用这个类.

序列化过程工作正常,但在反序列化后,默认情况下,属性IsPeriodic的值为true,尽管在某些情况下它是错误的.谁能帮我?

c# protobuf-net

2
推荐指数
1
解决办法
1975
查看次数

Protobuf-net和.proto文件?

我将使用protobuf-net库和我的WCF服务.客户端是Java-Android,我在那边使用proto文件.

我应该在.NET端手动编写类,还是protobuf-net以某种方式支持.proto文件?

.net java wcf protocol-buffers protobuf-net

2
推荐指数
1
解决办法
1684
查看次数

使用方法:1.使用Serializer.Merge/Serialize&2进行ISerializable,使用RuntimeTypeModel.Default进行ProtoInclude?

我翻译我的项目使用protobuf-net而不是BinaryFormatter.它看起来像有一个缺少文档http://code.google.com/p/protobuf-net/w/list 我也查阅了一些例子,从http://code.google.com/p/protobuf-net/source/browse / 但有些事情对我来说仍然不明确,这就是我决定在这里问的原因:

1.关于ISerializable和Serializer.Merge/Serialize

如果我们从ISerializable继承以进行特定的序列化.正如我读到的:ProtoBuf-Net ProtoInclude Generic Type Subclass 我们必须使用一个钩子Serializer.Merge/Serialize;

假设我们有课:

[Serializable]
[ProtoContract]
public class Anchor : ISerializable
{       
    [ProtoMember(1)]
    public int id;

    [ProtoMember(2)]
    public Ship ship;
    ...
 }
Run Code Online (Sandbox Code Playgroud)

Serializer.Merge(信息,这一点); 必须添加到构造函数Anchor(SerializationInfo info,StreamingContext context)

Serializer.Serialize(info,this); 添加到void GetObjectData(SerializationInfo info,StreamingContext context)

所以,我们有:

    protected Anchor(SerializationInfo info, StreamingContext context)
    {
        //for binaryformatter:            
        Type myType = typeof(Anchor);
        foreach (SerializationEntry e in info)
        {
            FieldInfo f = myType.GetField(e.Name,BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Public|BindingFlags.Instance);
            f.SetValue(this,e.Value);
        }

        //added for protobuf-net:
        Serializer.Merge(info, this);
   }

    public virtual void …
Run Code Online (Sandbox Code Playgroud)

inheritance serialization protocol-buffers protobuf-net iserializable

2
推荐指数
1
解决办法
1083
查看次数

ProtoBuf-Net错误消息"源数据中的无效字段:0"

我成功序列化了以下类的实例,但是当我在收到以下错误消息后尝试反序列化时:" Invalid field in source data: 0".

我不知道它是指什么,因为我发现下面的课程直截了当.我刚刚将protobuf-net版本更新为2.00.614(运行时版本:2.0.50727).

知道我是否可能忽视一些微不足道的事情?

[ProtoContract]
public class TimeSeriesProperties 
{
    [ProtoMember(1)]
    public string TimeSeriesName { get; private set; }
    [ProtoMember(2)]
    public string FileName { get; private set; }
    [ProtoMember(3)]
    public string TemplateName { get; private set; }
    [ProtoMember(4)]
    public int PacketLength { get; private set; }
    [ProtoMember(5)]
    public long FileSizeBytes { get; set; }
    [ProtoMember(6)]
    public long NumberRecords { get; set; }
    [ProtoMember(7)]
    public DateTime DateTimeStart { get; set; }
    [ProtoMember(8)]
    public DateTime DateTimeEnd …
Run Code Online (Sandbox Code Playgroud)

c# serialization protobuf-net deserialization

2
推荐指数
1
解决办法
2951
查看次数

通过AWS SQS传输ProtoBuf-net消息时无效的二进制字符

我正在使用Protobuf-net(https://code.google.com/p/protobuf-net/)对我的课程进行序列化,然后尝试通过Amazon SQS进行传输。

当我这样做时,我得到这个错误:

Amazon.SQS.AmazonSQSException: Invalid binary character '#xC' was found in the message body, the set of allowed characters is #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF].
Run Code Online (Sandbox Code Playgroud)

这是不言而喻的。

有没有人有一个很好的解决方案,如何使它工作?

protocol-buffers protobuf-net amazon-sqs

2
推荐指数
1
解决办法
1796
查看次数

必须为现有的proto包含Map创建java pojo

我试过将proto转换为java pojo.但得到了错误

[Stderr] Order.proto:12:18:预期"必需","可选"或"重复".[Stderr] Order.proto:12:21:预期的字段名称.

optional int32 orderID = 1; 
optional int32 quantity = 2;    
map<string,string> map_field = 4;
repeated string product = 3;
Run Code Online (Sandbox Code Playgroud)

请帮助我需要改变什么.我搜索谷歌protobuf开发者网站 https://developers.google.com/protocol-buffers/docs/proto#maps 它说地图字段不能重复,可选或必需

请帮我解决这个问题.

protocols protocol-buffers protobuf-net

2
推荐指数
1
解决办法
1628
查看次数