2010-08-15 3 views
1

Я использую BinaryFormatter для сериализации моего объекта. У меня есть разные типы объектов в их соответствующих списках. Есть ли «лучший» способ сериализации всех объектов в один файл, но иметь возможность разделить их на десериализацию? На данный момент я десериализую весь файл и проверяю конкретное поле в каждом объекте, чтобы увидеть, какой список я должен добавить в него после десериализации. Например, у всех моих автомобилей Ford есть поле «FORD», у Toyota есть «TOYOTA» и т. Д. После десериализации я «заглядываю» через объекты, проверяю поле «компания», а затем назначаю их List<Company>.Сериализация различных типов в один файл

Я не уверен, что это самый эффективный способ делать вещи. Какие-либо предложения? Спасибо за помощь

ответ

3

Это просто ... вместо сериализации каждого отдельного элемента. Просто создайте «родительский» класс, который просто имеет свойство для каждого типа элемента. И тогда вы можете сериализовать этот один объект. Когда вы десериализуете его на другом конце, он уже будет полностью отсортирован для вас.

0

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

Я думаю, что вы уже делаете все возможное, чтобы вы в рамках ограничений для сериализации в файл. Вы считали, что SQLite является вашим механизмом хранения?

0

То, что вы делаете, похоже на словарь (Dictionary<string, List<Company>>). Однако, пожалуйста, предоставьте исходный код в своем вопросе.

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

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

IEnumerable<Company> companiesFromFile = GetDeserializedFile(); 
var dictionaryFromFile = companiesFromFile.ToDictionary(c => c.Name); 

Затем, если вы должны отделить списки, вы можете сделать это с помощью:

List<Company> toyotaList = dictionaryFromFile["Toyota"]; 
// etc