c# - 如何将 protobuf 序列化内容直接写入 SharpZipLib 流

标签 c# protobuf-net sharpziplib

是否可以将 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; }

                ...

    }

最佳答案

这就是问题所在,我相信(在问题的原始代码中):

public void Serialize(Stream outputStream, T3 content)
{
    using (var stream = new MemoryStream())
    {
        Serializer.Serialize(stream, content);
    }
}

您完全忽略了 outputStream,而是将数据写入一个新的 MemoryStream 然后被忽略。

我怀疑你只是想:

public void Serialize(Stream outputStream, T3 content)
{
    Serializer.Serialize(outputStream, content);
}

我还建议从您的 Deserialize 方法中删除 using 语句:我希望调用者负责处理输入流完成后。您的方法可以简化为:

public T3 Deserialize(Stream inputStream)
{
    return ProtoBuf.Serializer.Deserialize<T3>(inputStream);
}

关于c# - 如何将 protobuf 序列化内容直接写入 SharpZipLib 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590932/

相关文章:

list - 如何在不使用 ascii 文本的情况下使用 protobuf.net 保存 List<Point>?

c# - 如何使用没有压缩的 SharpZipLib 将文件添加到存档?

c# - 枚举属性不一致的可访问性

c# - 类型不是预期的,并且无法使用 protobuf-net 的 .NET 预定义类推断出任何契约

c# - ProtoBuf-net 序列化 IEnumerable<T>

c# - 如何在azure中移动目录并在azure文件共享中使用ShareDirectoryClient对其进行ZIP

c# - 使用 SharpZipLib 将文件添加到没有路径的 ZIP

c# - 从某些应用程序调用时,Google OAuth 方法 AuthorizeAsync 挂起

c# - 比较手写 ADO/Sprocs 与 nHibernate

c# - TreeView子节点填充问题