标签: protobuf-net

C#中的协议缓冲区:如何处理盒装值类型

在以下示例中:

public class RowData
{
    public object[] Values;
}

public class FieldData
{
    public object Value;
}
Run Code Online (Sandbox Code Playgroud)

我很好奇protobuf-net或dotnet-protobufs如何处理这些类.我对protobuf-net比较熟悉,所以我实际拥有的是:

[ProtoContract]
public class RowData
{
    [ProtoMember(1)]
    public object[] Values;
}
[ProtoContract]
public class FieldData
{
    [ProtoMember(1)]
    public object Value;
}
Run Code Online (Sandbox Code Playgroud)

但是我收到一条错误,上面写着"找不到合适的默认对象编码".是否有一种简单的方法来对待这些类,我只是不知道?

详细说明用例:

这是远程处理中使用的数据类的缩小版本.所以基本上它看起来像这样:

FieldData data = new FieldData();
data.Value = 8;

remoteObject.DoSomething(data);
Run Code Online (Sandbox Code Playgroud)

注意:为简单起见,我省略了ISerializable实现,但它正如您所期望的那样.

.net protocol-buffers protobuf-net

4
推荐指数
1
解决办法
2250
查看次数

是否可以使用protobuf-net Serializer并同时使用相应的*.proto文件?

我有一个.NET类型,它既没有ProtoContract也没有DataContract.此外,并非所有状态都需要进行原始序列化.我可以为它定义一个.proto文件,但同时使用某种序列化程序来序列化它,好像它归因于ProtoContract?

谢谢.

protobuf-net

4
推荐指数
1
解决办法
2924
查看次数

如何在protobuf-net中手动将可选字段添加到类中

在我的.proto中,我有一些包含可选字段的消息.Debian没有本机原型,所以我没有一个可以试验(懒得自己编译:).

你能告诉我如何在C#中的类中实现可选字段吗?我想有一个函数或任何设置字段的idicate(在C++中我有像hasfoo()).在我在互联网上发现的例子中,没有类似的东西.

c# protobuf-net

4
推荐指数
1
解决办法
2392
查看次数

使用protobuf为c#反序列化"long"字符串对我来说无法正常工作

我显然做了一些基本的错误,但我无法弄明白,也找不到文档.

我正在尝试使用Marc Gravell的.NET for proto-buf,并尝试序列化和反序列化对象.一旦一个对象包含一个"太长"的字符串(没有试图确定大小阈值,但它只有几百个字节),字符串不会为我正确反序列化.

这是我的代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using ProtoBuf;

namespace ConsoleApplication1
{
public class Program
{
    [ProtoContract]
    public class test
    {
        [ProtoMember(1)]            
        public int i;
        [ProtoMember(2)]
        public string s1;
        [ProtoMember(3)]
        public string s2;
        [ProtoMember(4)]
        public char[] arrchars;
        [ProtoMember(5)]
        public Dictionary<int, string> Dict = new Dictionary<int, string>();

    }


    static void Main(string[] args)
    {
        test var1 = new test();
        var1.i = 10;
        var1.s1 = "Hello";
        var1.arrchars = new char[] …
Run Code Online (Sandbox Code Playgroud)

c# protobuf-net

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

如何最小化Protobuf.NET内存消耗

我正在使用Protobuf.NET序列化大量的类,其中大部分是作为引用(因为我有多个引用到我的数据结构中的相同类).

所有序列化类都使用ImplicitFirends.AllFields序列化,以确保所有内容都被转储.

在我目前的测试用例中,我有53个文件,总金额为500MB.

当我使用Protobuf.NET反序列化器读取这些数据时,我的专用字节/驻留内存最多可以射出9GB并且在那里保持不变(即,这不是在反序列化后发布的临时内存/ GC'd).

另一个特殊的事情是,如果我重写(重新序列化)所有数据,它仍然保持相同的大小.

这个x20在内存中爆炸是否有意义?

.net c# protobuf-net

4
推荐指数
1
解决办法
1016
查看次数

protobuf-net无法反序列化我的课程

我想序列化一个'Player'类,并通过我的网络流发送给客户端.

球员类

    [ProtoMember(1)]
    public int flag;
    [ProtoMember(2)]
    public Int16 id;
    [ProtoMember(3)]
    public MyVector3 CharPos;
    [ProtoMember(7)]
    public bool spawned;
Run Code Online (Sandbox Code Playgroud)

MyVector3(由于protobuf不支持序列化的事实Vector3)

[ProtoContract]
public class MyVector3
{
    [ProtoMember(4)]
    public float X { get; set; }

    [ProtoMember(5)]
    public float Y { get; set; }

    [ProtoMember(6)]
    public float Z { get; set; }

    public MyVector3()
    {
        this.X = 0.0f;
        this.Y = 0.0f;
        this.Z = 0.0f;
    }

    public MyVector3(float x, float y, float z)
    {
        this.X = x;
        this.Y = y;
        this.Z = …
Run Code Online (Sandbox Code Playgroud)

c# protobuf-net

4
推荐指数
1
解决办法
4366
查看次数

protobuf-net的prepareserializer有什么作用?

我假设它看着你的模型,并以某种方式准备好了,所以你的前几个序列化不会减慢.如果我的消息传递模型有一个带有子类的消息类怎么办?将我的父类放在类型参数中也会为所有孩子做好准备吗?

serialization protobuf-net

4
推荐指数
1
解决办法
1953
查看次数

Google协议缓冲区 - protobuf-net反序列化无法正常工作

我遇到了成功反序列化已使用预编译的protobuff序列化程序类序列化的字节数组的困难ModelSerializer.使用它,我定义的数据模型中的类的序列化和反序列化MyData在我序列化到文件并从文件反序列化时起作用MyData.

但是,我有另一个要求,即序列化为MyData字节数组,并将字节数组反序列化为MyData.下面是调用的基本类MyDataConverter,它有2个静态方法,一个用于转换MyData为字节数组,另一个用于转换字节数组MyData.

我可以MyData成功序列化到一个字节数组并将其写入MemoryStream.但是,当我反序列化字节数组时,我确实获得了一个非空实例MyData,但其中的所有数据都丢失了(默认null值为零,或者自定义类型的值).

我可以在这里出错吗?请注意,我确实使用类似的代码成功序列化到文件并从文件反序列化,所以它可能不是MyModel或预编译的ModelSerializer的错误.但如果有必要,我可以在这里粘贴一些信息.

public class MyDataConverter
{
    public static byte [] MyDataToBytes (MyData myData)
    {
        MemoryStream stream = new MemoryStream();
        ModelSerializer serializer = new ModelSerializer();

        serializer.Serialize (stream, myData);
        byte [] bytes = stream.ToArray();
        Stream.Close();

        return bytes;
    }

    public static MyData BytesToMyData (byte [] bytes)
    {
        MyData myData = null;

        MemoryStream stream = new MemoryStream();
        stream.Write …
Run Code Online (Sandbox Code Playgroud)

c# serialization protocol-buffers protobuf-net

4
推荐指数
1
解决办法
3909
查看次数

如何使用protobuf-net序列化不可变的封闭类型?

例如,我想序列化和反序列化System.Drawing.Font这是不可变的,不能进行更改以适应protobuf-net约定。通常,是否可以在protobuf-net中编写某种“自定义”序列化程序?

编辑:根据公认的答案,以下是代理的示例System.Drawing

[ProtoContract]
struct ProtoColor
{
    [ProtoMember(1, DataFormat=DataFormat.FixedSize)]
    public uint argb;
    public static implicit operator Color(ProtoColor c) 
        { return Color.FromArgb((int)c.argb); }
    public static implicit operator ProtoColor(Color c)
        { return new ProtoColor { argb = (uint)c.ToArgb() }; }
}
[ProtoContract()]
class ProtoFont
{
    [ProtoMember(1)]
    string FontFamily;
    [ProtoMember(2)]
    float SizeInPoints;
    [ProtoMember(3)]
    FontStyle Style;

    public static implicit operator Font(ProtoFont f) {
        return new Font(f.FontFamily, f.SizeInPoints, f.Style);
    }
    public static implicit operator ProtoFont(Font f) { 
        return f == null …
Run Code Online (Sandbox Code Playgroud)

protobuf-net

4
推荐指数
1
解决办法
1170
查看次数

如何有效地在ProtoBuf中建模HashMap/Dictionary

我有一个由.NET代码序列化的protobuf文件,我想将它用于Java.在.NET代码中,有Dictionary数据类型,proto架构看起来像

message Pair {
   optional string key = 1;
   optional string value = 2;
}

message Dictionary {
   repeated Pair pairs = 1;
}
Run Code Online (Sandbox Code Playgroud)

正如协议缓冲区中的stackoverflow post Dictionary中所述 .

我可以使用protoc将proto文件编译成Java类.我可以成功地将protobuf文件反序列化为Java对象.唯一的问题是它转换为Java中的Pair对象列表而不是HashMap.当然,我仍然拥有所有数据,但我无法按照自己的喜好有效地访问数据.如果我有键的值,我必须遍历整个列表以获得其对应的值.这似乎不是最佳的.

我想知道是否有更好的方法来模拟protobuf中的字典/地图数据类型.

谢谢

更新:

我试过Jon Skeet的建议,在地址簿示例中添加地图类型字段,但仍然遇到问题.

message Person {
  required string name = 1;
  required int32 id = 2;        // Unique ID number for this person.
  optional string email = 3;
  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2; …
Run Code Online (Sandbox Code Playgroud)

java serialization protocol-buffers protobuf-net

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

标签 统计

protobuf-net ×10

c# ×5

protocol-buffers ×3

serialization ×3

.net ×2

java ×1