Как я могу сохранить пользовательский тип как двоичные данные в .NET? - PullRequest
4 голосов
/ 26 сентября 2011

Я создаю что-то, что имеет файлы для сохранения.По большей части, это просто сохранение объектов с 4 значениями.

  • x
  • y
  • id
  • layer

Я какое-то время сохранял это как XML, проблема в том, что файлы начинают ОГРОМНЫ, потому что я сохраняю от сотен до тысяч этих объектов, а XML для такого типа довольно громоздкий.Я попытался переключиться на Json, но он был слишком велик (хотя, я признаю, лучше).

Мой вопрос

Я знаю, что многие программы сохраняются напрямую, используябайты для экономии места.Я хочу сделать это.Скажем, у меня есть 300 объектов со свойствами X, Y, Id и Layer, как я могу сохранить это в файл x в виде байтов и загрузить его позже?

Я пытался читать байты, когда использовалсобственные серверы.Я обычно заканчивал тем, что расстраивался и сдавался.Я надеюсь, что это не слишком похоже (моя интуиция говорит иначе).

РЕДАКТИРОВАТЬ

О, извините, ребята, я забыл упомянуть, я использую VB.NET так что все .NET ответы приемлемы!:)

Кроме того, все эти значения являются целыми числами.

Ответы [ 3 ]

6 голосов
/ 26 сентября 2011

Я бы использовал protobuf-net (я бы; я предвзято ...).Это сериализатор .NET с открытым исходным кодом, который использует атрибуты (ну, это необязательно в v2), чтобы направлять его.Например, используя синтаксис C # (чисто для моего удобства - движку все равно, какой язык вы используете):

[ProtoContract]
public class Whatever {
    [ProtoMember(1)]
    public int X {get;set;}
    [ProtoMember(2)]
    public int Y {get;set;}
    [ProtoMember(3)]
    public long Id {get;set;}
    [ProtoMember(4)]
    public string Layer {get;set;}
}

Затем можно сериализовать, например:

List<Whatever> data = ...
Serializer.Serialize(file, data);

и десериализовать:

var data = Serializer.Deserialize<List<Whatever>>(file);

работа выполнена;быстрый двоичный вывод.Вы, вероятно, можете сделать немного более узким, вручную закодировав все чтение / запись без каких-либо маркеров и т. Д., Но вышеприведенное будет намного проще.Также будет легко загрузить любую другую платформу, в которой доступна реализация «протокольных буферов» (а именно: большинство из них).

2 голосов
/ 26 сентября 2011

Альтернатива: почему бы не xml и zip (или какое-либо другое сжатие)

Преимущество:
* текстовые файлы, которые все еще читаются человеком
*, обычно имеют хороший коэффициент сжатия

И какое программирование вы используете?в C / C ++ или вы создаете структуру с переинтерпретацией данных, приводите структуру к байту * и записываете размер байтов в файл ... просто так (при условии, что структура имеет фиксированный размер (id и слой также являются переменными фиксированного размера, такими как int))

0 голосов
/ 26 сентября 2011

Почему вы не используете базу данных, такую ​​как MySql или SQL?

...