1

在使用 protobuf-net 在 c# 中反序列化一个大文件(20GB)期间,我得到一个"Sub-message not read correctly" Exception. 读取 2 GB 的 20 GB 后发生异常。相同的数据结构适用于较小的实例。

20 MB 数据的序列化工作正常。

下面是一些序列化的示例代码:

            if (File.Exists(filename))
                File.Delete(filename);

            using (FileStream stream = new FileStream(filename, FileMode.Create))
            {
                Serializer.Serialize<HubLabelingData>(stream, data);
                stream.Close();
            }

下面是一些反序列化的示例代码:

            using (FileStream stream = new FileStream(filename, FileMode.Open))
            {
                data = Serializer.Deserialize<HubLabelingData>(stream);
                stream.Close();
            }

这是数据结构(适用于小型实例):

[ProtoContract]
public class HubLabelingData
{
    [ProtoMember(1)]
    public HL[] hlf;

    [ProtoMember(2)]
    public HL[] hlb;

    [ProtoMember(3)]
    public NG g;

    [ProtoMember(4)]
    public List<PL> plf;

    [ProtoMember(5)]
    public List<PL> plb;

    [ProtoMember(6)]
    public PHL[] pihlf;

    [ProtoMember(7)]
    public PHL[] pihlb;
}

[ProtoContract]
public class HL
{
    [ProtoMember(1)]
    public int[] l;

    [ProtoMember(2)]
    public double[] d;
}

[ProtoContract]
public class PL
{
    [ProtoMember(1)]
    public Dictionary<int, List<GP>> p;
}

[ProtoContract]
public class PHL
{
    [ProtoMember(1)]
    public short[] l;
}

[ProtoContract]
public class NG
{
    [ProtoMember(1)]
    public NA[] e;

    [ProtoMember(2)]
    public NA[] tne { get; set; }

    [ProtoMember(3)]
    public float[] a;

    [ProtoMember(4)]
    public float[] o;

    [ProtoMember(5)]
    public int num = 0;

}

[ProtoContract]
public class NA
{
    [ProtoMember(1)]
    public int one { get; set; }

    [ProtoMember(2)]
    public int two { get; set; }

    [ProtoMember(3)]
    public double tree { get; set; }

    [ProtoMember(4)]
    public int four { get; set; }

}

[ProtoContract]
public class NN
{
    [ProtoMember(1)]
    public List<NA> nas;

}

[ProtoContract]
public class GP
{
    [ProtoMember(1)]
    public float one { get; set; }

    [ProtoMember(2)]
    public float two { get; set; }

}
4

2 回答 2

1

对于每个有同样问题的人:

Protbuf.net 不支持反序列化大于 2.048 GB 的文件(分别为对象)。

我将数据拆分为多条消息。还有很多工作,但效果很好。

于 2013-06-02T16:43:11.870 回答
0

protobuf-net 从 v2.2.0 开始支持反序列化大于 2GB 的流,但有一些警告。

从 v2.0.0.668 迁移到 v2.3.13 为我解决了这个问题,之前我遇到了"Sub-message not read correctly"异常。

发行说明

于 2018-06-19T23:58:12.053 回答