我有一个相当复杂的继承层次结构,包括泛型,我们正在尝试使用 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) 我正在 .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.")
下面是一个示例,说明了数据契约的一般结构 - 在本例中,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) 我正在尝试对 protobuf 消息实施限制,这些消息可以在使用不同语言的不同客户端之间共享
除此之外,我想对字符串长度实施限制,例如最小或最大长度,或者 int32 var 的最小和最大值范围
有没有办法实现这样的要求?非常感谢你的帮助!
我使用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)
当我这样做,deser有Field1 = -1和Field2 = 2,而不是0.我在这里做错了吗?
我在我的应用程序中使用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,尽管在某些情况下它是错误的.谁能帮我?
我将使用protobuf-net库和我的WCF服务.客户端是Java-Android,我在那边使用proto文件.
我应该在.NET端手动编写类,还是protobuf-net以某种方式支持.proto文件?
我翻译我的项目使用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
我成功序列化了以下类的实例,但是当我在收到以下错误消息后尝试反序列化时:" 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) 我正在使用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)
这是不言而喻的。
有没有人有一个很好的解决方案,如何使它工作?
我试过将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 它说地图字段不能重复,可选或必需
请帮我解决这个问题.
protobuf-net ×10
c# ×4
.net ×1
amazon-sqs ×1
grpc ×1
inheritance ×1
java ×1
protocols ×1
wcf ×1