【发布时间】:2013-10-25 13:16:17
【问题描述】:
是否可以将 protobuf 序列化内容直接写入 SharpZipLib 流?当我尝试这样做时,看起来提供的流没有填充来自 protobuf 的数据。稍后我需要从提供的 Zip 流中取回反序列化的实体。 我的代码如下所示:
private byte[] ZipContent(T2 content)
{
const short COMPRESSION_LEVEL = 4; // 0-9
const string ENTRY_NAME = "DefaultEntryName";
byte[] result = null;
if (content == null)
return result;
IStreamSerializerProto<T2> serializer = this.GetSerializer(content.GetType());
using (MemoryStream outputStream = new MemoryStream())
{
using (ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream))
{
zipOutputStream.SetLevel(COMPRESSION_LEVEL);
ZipEntry entry = new ZipEntry(ENTRY_NAME);
entry.DateTime = DateTime.Now;
zipOutputStream.PutNextEntry(entry);
serializer.Serialize(zipOutputStream, content);
}
result = outputStream.ToArray();
}
return result;
}
private class ProtobufStreamSerializer<T3> : IStreamSerializerProto<T3>
{
public ProtobufStreamSerializer()
{
ProtoBuf.Serializer.PrepareSerializer<T3>();
}
public void Serialize(Stream outputStream, T3 content)
{
Serializer.Serialize(outputStream, content);
}
public T3 Deserialize(Stream inputStream)
{
T3 deserializedObj;
using (inputStream)
{
deserializedObj = ProtoBuf.Serializer.Deserialize<T3>(inputStream);
}
return deserializedObj;
}
}
我正在尝试序列化的类的示例:
[Serializable]
[ProtoContract]
public class Model
{
[XmlElement("ModelCode")]
[ProtoMember(1)]
public int ModelCode { get; set; }
...
}
【问题讨论】:
-
你要序列化的数据是什么?即
content是什么?类型的定义是什么(理想情况下,我可以看到属性),与实例关联的值是什么? -
您的编辑仍然不足以让我认为 0 字节是意外的。如果
Model都是默认值,写起来没什么意思,完全可以写成0字节。您是否有一个完整的示例来显示我们可能合理预期会占用空间的实际数据? -
请注意,二进制数据的压缩并非“轻而易举”;它通常可以使输出更大。建议谨慎。
标签: c# protobuf-net sharpziplib