在以下示例中:
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类型,它既没有ProtoContract也没有DataContract.此外,并非所有状态都需要进行原始序列化.我可以为它定义一个.proto文件,但同时使用某种序列化程序来序列化它,好像它归因于ProtoContract?
谢谢.
在我的.proto中,我有一些包含可选字段的消息.Debian没有本机原型,所以我没有一个可以试验(懒得自己编译:).
你能告诉我如何在C#中的类中实现可选字段吗?我想有一个函数或任何设置字段的idicate(在C++中我有像hasfoo()).在我在互联网上发现的例子中,没有类似的东西.
我显然做了一些基本的错误,但我无法弄明白,也找不到文档.
我正在尝试使用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) 我正在使用Protobuf.NET序列化大量的类,其中大部分是作为引用(因为我有多个引用到我的数据结构中的相同类).
所有序列化类都使用ImplicitFirends.AllFields序列化,以确保所有内容都被转储.
在我目前的测试用例中,我有53个文件,总金额为500MB.
当我使用Protobuf.NET反序列化器读取这些数据时,我的专用字节/驻留内存最多可以射出9GB并且在那里保持不变(即,这不是在反序列化后发布的临时内存/ GC'd).
另一个特殊的事情是,如果我重写(重新序列化)所有数据,它仍然保持相同的大小.
这个x20在内存中爆炸是否有意义?
我想序列化一个'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) 我假设它看着你的模型,并以某种方式准备好了,所以你的前几个序列化不会减慢.如果我的消息传递模型有一个带有子类的消息类怎么办?将我的父类放在类型参数中也会为所有孩子做好准备吗?
我遇到了成功反序列化已使用预编译的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) 例如,我想序列化和反序列化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) 我有一个由.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)