我想将对象序列化为字符串,然后返回.
我们使用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) 我最近不得不寻找最初由Google开发的Protocol Buffers库的C#移植.猜猜看,我在这里发现了两个知名人士拥有的两个项目:由Jon Skeet编写的protobuf-csharp-port和由Marc Gravell编写的protobuf-net.我的问题很简单:我必须选择哪一个?
我非常喜欢Marc的解决方案,因为在我看来,我更接近C#philisophy(例如,你可以只添加属性到现有类的属性),看起来它可以支持.NET内置类型,如System.Guid.
我相信他们两个都是很棒的项目,但你的意见是什么?
(这是我在我的RSS中看到的一个问题的重新发布,但被OP删除了.我重新添加了它,因为我已经在不同的地方多次询问过这个问题; wiki为"好"形成")
突然间,我ProtoException在反序列化时收到了一个消息:未知的线型6
我想了解为什么由Marc Gravell开发的协议缓冲解决方案的速度和它一样快.
我可以理解原始Google解决方案如何实现其性能:它预先生成用于对象序列化的优化代码; 我已经手工编写了一些序列化,并且知道如果避免反射,可以用这种方式编写相当快的代码.但Marc的库是一个运行时解决方案,它使用属性并且不会生成任何生成的代码.那么它是怎样工作的 ?
协议缓冲区如何处理类型版本控制?
例如,当我需要随时间更改类型定义时?喜欢添加和删除字段.
我们的系统,当使用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) 我们在序列化一个空列表时遇到了一些问题.这里有一些使用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字节,对(类型信息?)?
我们需要这种类型的发送,因为在响应中是来自服务器的消息给我们的客户端.
试图让我的思绪围绕谷歌protobuf.我在C#中发现了一些protobuf的实现,但它们似乎缺少一个功能:能够从使用属性修饰的现有C#类自动生成.proto文件.
我想这样做而不是从.proto文件中自动生成的C#类的原因是因为我已经在我的项目中定义了C#类,我不想复制它们只是为了满足ProtoBuf.
有没有人遇到过这种情况?
更新
这可能只是装饰一个C#类而不是使用.proto文件来使用protobuf吗?
如果这是重复,我很抱歉.我在几个地方搜索了一些我可能理解的答案,包括:
我道歉但我并不真正理解答案.我正在寻找一个更快,更紧凑的二进制序列化器,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)