标签: protobuf-net

将Stream转换为String并返回...我们缺少什么?

我想将对象序列化为字符串,然后返回.

我们使用protobuf-net将对象转换为Stream并成功返回.

但是,Stream to string and back ...不太成功.经过StreamToString并且StringToStream,新Stream的没有被protobuf-net反序列化; 它提出了一个Arithmetic Operation resulted in an Overflow例外.如果我们反序列化原始流,它可以工作.

我们的方法:

public static string StreamToString(Stream stream)
{
    stream.Position = 0;
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    {
        return reader.ReadToEnd();
    }
}

public static Stream StringToStream(string src)
{
    byte[] byteArray = Encoding.UTF8.GetBytes(src);
    return new MemoryStream(byteArray);
}
Run Code Online (Sandbox Code Playgroud)

我们的示例代码使用这两个:

MemoryStream stream = new MemoryStream();
Serializer.Serialize<SuperExample>(stream, test);
stream.Position = 0;
string strout = StreamToString(stream);
MemoryStream result = (MemoryStream)StringToStream(strout);
var other = …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization protobuf-net deserialization

152
推荐指数
6
解决办法
32万
查看次数

如何在protobuf-csharp-port和protobuf-net之间进行选择

我最近不得不寻找最初由Google开发的Protocol Buffers库的C#移植.猜猜看,我在这里发现了两个知名人士拥有的两个项目:由Jon Skeet编写的protobuf-csharp-port和由Marc Gravell编写的protobuf-net.我的问题很简单:我必须选择哪一个?

我非常喜欢Marc的解决方案,因为在我看来,我更接近C#philisophy(例如,你可以只添加属性到现有类的属性),看起来它可以支持.NET内置类型,如System.Guid.

我相信他们两个都是很棒的项目,但你的意见是什么?

c# protobuf-net

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

使用Protobuf-net,我突然得到一个关于未知线型的例外

(这是我在我的RSS中看到的一个问题的重新发布,但被OP删除了.我重新添加了它,因为我已经在不同的地方多次询问过这个问题; wiki为"好"形成")

突然间,我ProtoException在反序列化时收到了一个消息:未知的线型6

  • 什么是线型?
  • 有哪些不同的线型值及其描述?
  • 我怀疑一个字段导致了问题,如何调试这个?

c# protobuf-net

60
推荐指数
4
解决办法
5万
查看次数

protobuf-net如何实现可观的性能?

我想了解为什么由Marc Gravell开发的协议缓冲解决方案的速度和它一样快.

我可以理解原始Google解决方案如何实现其性能:它预先生成用于对象序列化的优化代码; 我已经手工编写了一些序列化,并且知道如果避免反射,可以用这种方式编写相当快的代码.但Marc的库是一个运行时解决方案,它使用属性并且不会生成任何生成的代码.那么它是怎样工作的 ?

.net c# reflection protocol-buffers protobuf-net

35
推荐指数
1
解决办法
5091
查看次数

协议缓冲区如何处理版本控制?

协议缓冲区如何处理类型版本控制?

例如,当我需要随时间更改类型定义时?喜欢添加和删除字段.

protocol-buffers protobuf-net

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

开始使用protobuf-net

我正在尝试使用protobuf.net.

我从这里下载了最新版本,实现了一个[ProtoContract]类,现在我正在尝试使用文档中ProtoBuf.Serializer.Serialize描述的序列化它.问题是,没有这样的方法.

我该如何写入[ProtoContract]磁盘?

更新 显然,我有错误的版本或类似的东西,但这是我Serialize班级的样子:

我看到protobuf.net Serializer类

c# protobuf-net

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

Protobuf-net:尝试读取流的结尾

我们的系统,当使用protobuf-net序列化一条消息时,有时但不是每次都会引发下面暴露的错误.错误的原因是什么?如何缓解错误?

请注意我们DeserializeWithLengthPrefix已经在使用.

更新:相关代码在这里

private const PrefixStyle PrefixStyleInPlace = PrefixStyle.Fixed32;
public static byte[] SerializeObjectToByteArray<TSerializable>(TSerializable source) where TSerializable : class
    {
        byte[] result;
        using (var memoryStream = SerializeObjectToStream(source))
        {
            result = memoryStream.ToArray();
        }
        return result;
    }


    public static TResult DeserializeObject<TResult>(byte[] source)
    {
        TResult result;
        using (var memoryStream = new MemoryStream(source))
        {
            memoryStream.Position = 0;
            result = Serializer.DeserializeWithLengthPrefix<TResult>(memoryStream,PrefixStyleInPlace);
        }

        return result;
    }

    public static MemoryStream SerializeObjectToStream<TSerializable>(TSerializable source) where TSerializable : class
    {
        var memoryStream = new MemoryStream();

        Serializer.SerializeWithLengthPrefix(memoryStream, source,PrefixStyleInPlace);
        memoryStream.Position = …
Run Code Online (Sandbox Code Playgroud)

c# protobuf-net

30
推荐指数
1
解决办法
5037
查看次数

protobuf-net:序列化一个空列表

我们在序列化一个空列表时遇到了一些问题.这里有一些使用CF 2.0的.NET代码

//Generating the protobuf-msg
ProtoBufMessage msg = new ProtoBufMessage();
msg.list = new List<AnotherProtobufMessage>();
// Serializing and sending throw HTTP-POST
MemoryStream stream = new MemoryStream();
Serializer.Serialize(stream, msg);
byte[] bytes = stream.ToArray();
HttpWebRequest request = createRequest();
request.ContentLength = bytes.Length ;

using (Stream httpStream = request.GetRequestStream())
{              
      httpStream.Write(bytes, 0, bytes.Length);
}
Run Code Online (Sandbox Code Playgroud)

当我们尝试在流上写入时(bytes.length超出范围),我们得到了一个异常.但是具有空列表的类型不应该是0字节,对(类型信息?)?

我们需要这种类型的发送,因为在响应中是来自服务器的消息给我们的客户端.

.net c# serialization protobuf-net

28
推荐指数
1
解决办法
7542
查看次数

如何从使用属性修饰的C#类生成.proto文件?

试图让我的思绪围绕谷歌protobuf.我在C#中发现了一些protobuf的实现,但它们似乎缺少一个功能:能够从使用属性修饰的现有C#类自动生成.proto文件.

我想这样做而不是从.proto文件中自动生成的C#类的原因是因为我已经在我的项目中定义了C#类,我不想复制它们只是为了满足ProtoBuf.

有没有人遇到过这种情况?


更新

这可能只是装饰一个C#类而不是使用.proto文件来使用protobuf吗?

.net c# serialization protocol-buffers protobuf-net

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

如何使用ProtoBuf-Net序列化继承的类

如果这是重复,我很抱歉.我在几个地方搜索了一些我可能理解的答案,包括:

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

使用protobuf-net序列化继承的类

我道歉但我并不真正理解答案.我正在寻找一个更快,更紧凑的二进制序列化器,ProtoBuf看起来可能是答案.我需要序列化一组所有派生自一个基类的类.它们有很多,所以在提交编辑类代码之前,我运行了一个简单的测试.此外,我不想以任何可能影响反序列化使用NET二进制序列化程序生成的旧持久文件的方式修改类.

这是基类:

[ProtoContract]
    public class BaseClass
    {
        [ProtoMember(1)]
        public string Name
        {
            get; set;
        }
        [ProtoMember(2)]
        public int Age
        {
            get; set;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是派生类:

[ProtoContract]
    public class SubClass1 : BaseClass
    {
        [ProtoMember(3)]
        public string Town
        {
            get; set;
        }

        [ProtoMember(4)]
        public Sex Sex
        {
            get; set;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是序列化和反序列化的代码(直接来自"入门指南"

var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };

            using (var file = File.Create(filename))
            {
                Serializer.Serialize(file, person); …
Run Code Online (Sandbox Code Playgroud)

c# serialization protobuf-net

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