Tag: protobuf net

序列化图形时出现exception

我还在玩新发布的protobuf-net版本,我正面临一个我不明白的问题。 让我们考虑以下代码: [ProtoContract] class Node { public Node() { Children = new List(); } [ProtoMember(1, IsRequired = true)] public int Data { get; set; } [ProtoMember(2, IsRequired = true, AsReference = true)] public List Children { get; set; } public void AddChild(Node child) { Children.Add(child); } } static void Main() { Node n = new […]

使用ProtoBuf.Meta接口模仿ProtoEnumAttribute

在protobuf-net中 ,您可以使用ProtoEnumAttribute覆盖枚举的有线格式, ProtoEnumAttribute所示: [ProtoContract] enum MyEnum { [ProtoEnum(Value=1)] Default, [ProtoEnum(Value=10)] Foo } 使用这些属性, Default通常会序列化为0 , Foo为1它们现在将分别序列化为1和10 。 我正在尝试做的是使用ProtoBuf.Meta接口模仿这种行为,所以我不必注释枚举(因为我通常不会在我的项目中控制它们)。 通过protobuf-net的源码挖掘,我设法得到以下(简化了一点)工作: var model = RuntimeTypeModel.Create(); var meta = model.Add(enumType, applyDefaultBehaviour: true); var fields = meta.GetFields(); // Oh god why var fieldNumber = typeof(ValueMember).GetField( “fieldNumber”, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic ); List ordered = GetDesiredEnumOrder(enumType); int equiv = 0; foreach […]

套接字上的Protobuf-net序列化。 没有无参数构造函数发现ProtoException

我创建了一个使用套接字完成进程间通信的应用程序。 当客户端与我创建的服务器连接并发送序列化消息时,该过程开始。 这条消息,我使用Protobuf-net进行序列化,使用SerializeWithLengthPrefix并使用DeserializeWithLengthPrefix对其进行反序列化。 客户端将消息发送到完全反序列化的服务器,但在服务器到客户端的情况下却不是这样。 主类是BaseMessage,它是抽象的。 [Serializable, ProtoContract, ProtoInclude(5001, typeof(LogonMessage))] abstract public class BaseMessage { public BaseMessage() { } abstract public int MessageType { get; } } LogonMessage实现了BaseMessage类。 [Serializable, ProtoContract] public class LogonMessage : BaseMessage { public LogonMessage() { } [ProtoMember(1)] public string Broker { get; set; } [ProtoMember(2)] public int ClientType { get; set; } […]

使用protobuf-net序列化枚举时出现InvalidOperationException

我正在尝试序列化使用[Flags]属性修饰的enum类型。 enum声明如下: [Flags] [ProtoContract(EnumPassthru = true)] public enum Categories { [ProtoEnum(Name = nameof(Invalid), Value = 0x0)] Invalid = 0x0, [ProtoEnum(Name = nameof(A), Value = 0x1)] A = 0x1, [ProtoEnum(Name = nameof(B), Value = 0x2)] B = 0x2, [ProtoEnum(Name = nameof(C), Value = 0x4)] C = 0x4, [ProtoEnum(Name = nameof(D), Value = 0x8)] D = 0x8, […]

有没有办法在protobuf-net中使用IReadOnlyCollection / IReadOnlyList

我认为,在使用集合时,protobuf-net需要GetEnumerator进行序列化,并使用Add进行反序列化。 对于没有Add类型,您可以设置在反序列化之前执行的inheritance类型。 这适用于IEnumerable和List : [ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] public class Sheep { public IEnumerable Children { get; set; } public Sheep() { Children = new List(); } } var dolly = RuntimeTypeModel.Default.DeepClone(new Sheep { Children = new[] { “Bonnie”, “Sally”, “Rosie”, “Lucy”, “Darcy”, “Cotton” } }); 但是,当我对IReadOnlyCollection (或IReadOnlyList )执行相同操作时: [ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] public class Sheep { […]

没有为Protobuf-net中的类型:System.Management.Automation.PSObject定义的序列化程序

这是我的class级 [ProtoContract] internal class Powershellresults { internal Powershellresults() { } [ProtoMember(1)] public Collection PsObjects { get; set; } [ProtoMember(2)] public string Script { get; set; } [ProtoMember(3)] public string Viewname { get; set; } } 但我得到没有为类型定义序列化程序:System.Management.Automation.PSObject当我尝试序列化它 private byte[] SerializeResults(Powershellresults obj) { byte[] data; using (var ms = new MemoryStream()) { ProtoBuf.Serializer.Serialize(ms, obj); data = ms.ToArray(); […]

ProtoBuf.net序列化派生类时不包括基类属性

使用最新的2.0 beta版ProtoBuf.net我试图序列化派生类(只是示例),我得到空文件。 为什么基类属性没有序列化? [ProtoContract] [Serializable] public class Web2PdfClient : Web2PdfEntity { } [ProtoContract] [Serializable] public class Web2PdfEntity : EngineEntity { [ProtoMember(1)] public string Title { get; set; } [ProtoMember(2)] public string CUrl { get; set; } [ProtoMember(3)] public string FileName { get; set; } } [ProtoContract] [Serializable] public class EngineEntity { public bool Result { […]

在没有架构的情况下解码protobuf

是否有可能解码protobuf序列化文件而无需使用工具或任何可将二进制数据解码为可读格式的模式?

我可以重用对象实例来避免使用protobuf-net进行分配吗?

上下文:这是基于在我回答之前被问及然后删除的问题 – 但我认为这是一个很好的问题,所以我整理了它,重新发布并重新发布。 在使用protobuf-net的高吞吐量场景中,大量分配是一个问题(特别是对于GC),是否可以重用对象? 例如,通过添加Clear()方法? [ProtoContract] public class MyDTO { [ProtoMember(1)] public int Foo { get; set; } [ProtoMember(2)] public string Bar { get; set; } [ProtoMember(3, DataFormat = DataFormat.Group)] public List Values { get { return values; } } private readonly List values = new List(); public void Clear() { values.Clear(); Foo = 0; […]

从C插件向Unity3D发送字节数据的任何正确方法?

这里只是一个好奇的问题。 当您在iOS平台上为Unity编写插件时,插件具有有限的本机到托管回调function(从插件再到Unity)。 基本上这个文档: iOS插件Unity文档 说明你能够回拨的函数签名是这样的: 只能从本机代码调用与以下签名对应的脚本方法:function MethodName(message:string) C中定义的签名如下所示: void UnitySendMessage(const char * obj,const char * method,const char * msg); 所以这几乎意味着我只能将字符串发送回Unity。 现在在我的插件中,我使用protobuf-net来序列化对象并将它们发送回Unity以进行反序列化。 我已经让这个工作,但通过一个解决方案我觉得很丑陋,并不是很优雅: Person* person = [[[[[Person builder] setId:123] setName:@”Bob”] setEmail:@”bob@example.com”] build]; NSData* data = [person data]; NSString *rawTest = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; UnitySendMessage(“GameObject”, “ReceiveProductRequestResponse”, [rawTest cStringUsingEncoding:NSUTF8StringEncoding]); 基本上我只是将字节流编码为字符串。 在Unity中,我然后获取字符串的字节并从那里反序列化: System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); Byte[] bytes = […]