2013-06-01 3 views
1

Во время десериализации большого файла (20 ГБ) в C# с protobuf-net я получаю "Sub-message not read correctly" Exception. Исключение происходит после чтения 2 ГБ 20 ГБ. Такая же структура данных работает с меньшим экземпляром.Исключение: Под-сообщение не читается правильно

Сериализация данных 20 МБ работает нормально.

Вот несколько примеров кода для сериализации:

  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; } 

} 
+0

Пожалуйста, отправьте код примера – KenD

+0

Вам нужен еще один пример кода? – ditzel

+0

@ ditzel Вы должны показать код объекта «HubLabelingData». –

ответ

1

Для всех с той же проблемой:

Protbuf.net не поддерживает десериализацию файлов (соответственно объектов) размером более 2 048 ГБ.

Я разделил данные на несколько сообщений. Было намного больше работы, но она работает отлично.

+1

Я бы всегда предлагал использовать сообщение с несколькими разделителями, а не одно огромное сообщение, если вы можете –

+0

Вы имеете в виду 2048 МБ? – Slugart

Смежные вопросы