Казалось бы, на первый взгляд, простейшая задача. Есть Dictionary<string, object>. Нужно записать его в ветку реестра текущего пользователя и восстановить потом в обратно Dictionary<string, object>. Беда только в том, что в object могут быть разные типы. В том числе целые могут быть разных тпов: int, long, uint... Там могут появляться только примитивные типы или к ним сводимые (строки, целые разных типов, энумы, даты), т.е. типы колонок БД. Вот только важно, чтобы если был long, чтобы они десерелизоваля.
Решил сереализнуть его через Newton json, но он информацию о типах не особо сохраняет, так что при десериализации вместо, скажем, uint или long получаем int, а это не приемлемо.
Добился желаемого только через BinaryFormatter. Но он порождает очень некомпактный выхлоп. Тратить время на зипование тоже не хочется.
Есть какие-то более компактные альтернативы корректно сохраняющие тип значений в object-ах?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Решил сереализнуть его через Newton json, но он информацию о типах не особо сохраняет, так что при десериализации вместо, скажем, uint или long получаем int, а это не приемлемо.
.. VD>Есть какие-то более компактные альтернативы корректно сохраняющие тип значений в object-ах?
VD>Есть какие-то более компактные альтернативы корректно сохраняющие тип значений в object-ах?
Посмотри подойдёт ли тебе Ceras. Это практически BinaryFormatter, только делался прямыми руками. Умеет и в типы объектов, и в наследование, и в circular references.
Здравствуйте, VladD2, Вы писали:
VD>Есть какие-то более компактные альтернативы корректно сохраняющие тип значений в object-ах?
Если я правильно ошибаюсь, Newton имеет флаг "сериализовать вместе с типами". Понятно, что результат будет несколько раздутым, но... разве это так важно?
Здравствуйте, VladD2, Вы писали:
VD>Есть какие-то более компактные альтернативы корректно сохраняющие тип значений в object-ах?
О, вспомнил! Т4 шаблон? Сохраняешь в свой формат (ибо JSON тоже не идеал) и все типы корректно обрабатываются.
Я тоже столкнулся с весьма бестолковой работой Newton — получается, он сначала десериализует "нечто" в наибольший тип, а потом пытается этот тип засунуть в проперть. Это же глупо! Думаю, Т4 сериализатор уделает этот Ньютон как байкер улитку.
Здравствуйте, VladD2, Вы писали:
VD>Есть какие-то более компактные альтернативы корректно сохраняющие тип значений в object-ах?
Ну, тут либо перебрать имеющиеся бинарные форматы: BSON, CBOR, MessagePack,... но вряд ли они будут отличать int от long, либо за день написать пару своих методов для сериализации/десериализации ограниченного числа типов.
Вопрос задачи и её важности. Ничего плохого в BinaryFormatter и его архивации нет. Если по факту скорость работы будет приемлема, то нечего и велосипеды строить. Те же офисные программы давно уже ушли от бинарных форматов и пришли к упакованным xml, как-то люди с этим живут