Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
.NET 4.x

Версии файлов. Структура

22.08.2017, 16:20. Показов 1951. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть у меня к примеру такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[serializable]
public class MyData
{
    public string Name {get;set;}
    public AdditionalData {get;set;}
    public EDocType {get;set;}
}
 
public class AdditionalData
{
    public int ID {get;set;}
    public double Count {get;set;}
}
 
public enum EDocType
{
    Word,
    Excel
}
И версия программы 1.0
Данные сериализуются в JSON.
Десериализуются с параметрами
C#
1
2
3
4
5
6
var jsonSerializerSettings = new JsonSerializerSettings
                                                     {
                                                         TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Full,
                                                         TypeNameHandling = TypeNameHandling.Objects
                                                     };
return JsonConvert.DeserializeObject<T>(str, jsonSerializerSettings);
Понадобилось добавить версионность с возможностью обработки уже существующих данных. Т.е. теперь стало так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[serializable]
public class MyData
{
    public string Name {get;set;}
    public AdditionalData {get;set;}
    public EDocType {get;set;}
    public const string FileVersion = "1.0";
}
 
 
public class AdditionalData
{
    public int ID {get;set;}
    public string Country {get;set;}
}
Код приложения, после обновления "внутреннего формата" данных, уже НЕ работает со старыми данными, только с новыми (код public double Count просто не участвует больше в логике).
Вопрос: как грамотно организовать такое? Т.е. по константе версии узнавать что и как надо десериализовать.

Добавлено через 7 минут
На данном этапе можно всё перекроить, кроме структуры данных. Т.е. заменить сериализацию, заменить десериализацию, использовать любые возможности языка и любые способы программирования. Главное, чтобы на выходе можно было сотворить массив байт и запихнуть в файл. А на входе данные преобразовать обратно в классы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.08.2017, 16:20
Ответы с готовыми решениями:

Структура, доступная из всех файлов проекта ("глобальная" структура)
Есть четыре структуры (body, gun, enemy, st), описанные в main.cpp. К main.cpp подключен хедер save.h, в котором имеется функция void...

Преобразование файлов из версии 14 в Прайм 3.1
Добрый день,имеются файлы в хмсд (14 маткад) нужно конвертировать для работы в Прайм 3.1.После конвертации выводит вот такие данные.Вопрос...

Определение версии любых exe - файлов
Вот, хочу узнать версию програмки, что б потом автоматическое обновление можно было сделать. Только хотелось бы версию файла узнать. Ни кто...

25
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.08.2017, 16:22
Студворк — интернет-сервис помощи студентам
skilllab, один вопрос: вам обязательно использовать формат Json? Это критично?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
26.08.2017, 16:26  [ТС]
insite2012, ещё раз - нет. Я ж писал, просто гуглится по нему много.
Вон, товарищ выше предложил его собственный сериализатор, тоже чуток ковыряю.
Цитата Сообщение от Casper-SC Посмотреть сообщение
передать List<SomeType>
он и передаётся. Точнее так: когда SomeType, когда List<SomeType>.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.08.2017, 16:27
Цитата Сообщение от skilllab Посмотреть сообщение
нет. Я ж писал, просто гуглится по нему много.
Хорошо.
Тогда второй вопрос-вы планируете передавать ваши объекты по сети, я правильно понимаю?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
26.08.2017, 16:33  [ТС]
insite2012, на данный момент JSON позволил пересоздавать свойства при их отсутствии без выкидываний эксепшнов при десериализации.

Добавлено через 1 минуту
Цитата Сообщение от insite2012 Посмотреть сообщение
ваши объекты по сети
Нет. Всё в рамках одной сборки вертится. Из некоего файла получаю свою Модель. Кручу-верчу - и сериализую обратно. В очередной раз для кручения-верчения понадобилось имя свойства поменять или там добавить чего. Вот и появилась идея с FileVersion.

Добавлено через 3 минуты
Т.е. в новой версии сборки - обновлённая Модель данных. Передаю сборку потенциальному пользователю, а он не ловит "невозможно прочитать данные" или нечто подобное. Это блин, как его... совместимость версий. Но преимущественно "вверх". Т.е. старую версию Модели использовать неполучится, ибо код переписан. Но при этом данные никуда не деваются.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.08.2017, 17:30
Цитата Сообщение от skilllab Посмотреть сообщение
в новой версии сборки - обновлённая Модель данных. Передаю сборку потенциальному пользователю
Эмм... Я что-то не совсем понял цель... Если вы передали обновленную сборку пользователю, то он уже и так знает о новой версии... К чему тогда все это?
Давайте я расскажу, как это реализуется в WCF, а выводы сделаете сами.
Например, есть у нас контракт данных, такого вида.
C#
1
2
3
4
5
6
7
    [DataContract]
    class User {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
    }
Мы его используем на обоих сторонах: в службе и в клиенте, и все нормально.
Но в один прекрасный момент кто-то изменил свой контракт, добавил в него еще свойство, как в коде ниже.
C#
1
2
3
4
5
6
7
8
9
    [DataContract]
    class User {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public int Age { get; set; }
    }
И к примеру, мы передаем новое значение (v.2) стороне, которая знает только о старом значении (v.1).
По умолчанию сериализатор DataContractSerializer просто игнорирует новые поля (если не указано иное), и работоспособность системы сохраняется.

Теперь более сложный сценарий. Допустим, мы передаем от стороны А контракт новой версии (v.2) стороне Б, которой известно только о старой версии (v.1), а она, в свою очередь, передает данные дальше, стороне С, которой о новых данных известно (v.2). Вопрос-что делать для того, чтобы в процессе передачи (это называется передача со сквозным изменением версии) не потерять данные?
Все просто-в каждом контракте данных реализуем интерфейс IExtensibleDataObject, с одним свойством, как в коде ниже.
C#
1
2
3
4
5
6
7
8
9
10
11
    [DataContract]
    class User : IExtensibleDataObject {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public int Age { get; set; }
 
        public ExtensionDataObject ExtensionData { get; set; }
    }
Теперь, когда сериализатор на принимающей стороне не находит в описании типа нужных полей (которые присутствуют в исходном сообщении), он просто сохраняет все лишние данные в свойстве данного интерфейса. При передаче дальше все необходимые данные извлекаются из данного свойства и тип восстанавливается к исходной форме.

Вот так это работает в WCF. Что из этого можно применить в вашей задаче-вам виднее.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
26.08.2017, 18:08  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
ExtensionDataObject
я ещё в 4 сообщении это всё загуглил))
Цитата Сообщение от insite2012 Посмотреть сообщение
Эмм... Я что-то не совсем понял цель...
Теперь я объясню своё. На примере.
Есть у меня сторонняя программа, которая позволяет внутри своих файлов хранить конейнеры с byte[].
Работая в той программе, и с помощью моего ActiveX, пользователь генерирует некоторые данные, которые как бы дополняют файл той программы. Эти данные должны быть жёстко связаны с файлом и должны быть неотделимы - что и достигается контейнерами.
В моем случае, разработка моего ActiveX идёт полным ходом и уже близка к концу. Но моя Модель данных (та самая, чо сериализуется внутрь файла сторонней программы) может претерпевать изменения. Раньше (неделю назад) всё работало через JSON просто тупо и напрямую. Просто брал класс и сериализовал. У класса разве что был атрибут [Serializable]. При всём при этом со стороны пользователя идёт полное тестирование моего компонента, ибо логики там море. Вот и получается, что создав какое-то время назад "Модель-А", она претерпевает изменения. И со стороны пользователя я прошу просто "пересоздать данные пока я полностью не устаканю модель". Появляется "Модель-Б" в коде. Но в файлах пользователя то всё ещё "Модель-А".
В принципе, с развитием самого моего ActiveX может быть ещё не раз изменение Модели, но есть уже закреплённые свойства, которые не будут изменяться. Кто то скажет "а чего не сделать какой нибудь конвертер, который будет при загрузке перегонять "Модель-А" в "Модель-Б"?" Я отвечу: а я захотел вот вот так
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2017, 18:08

Структура файлов
Может мне и не сюда, но вопрос задам - я ищу что-то типа справочного пособия по структуре файлов разного типа. то есть как файл каждого...

Обновление программных файлов в зависимости от номера версии (GetFileVersion)
Обновление программных файлов в зависимости от номера версии (GetFileVersion).

Структура файлов проекта
Доброе утро. Имеется несколько файлов, в каждом из файлов используется несколько констант. С точки зрения расположения файлов в проекте где...

Структура файлов Mhc
Господа! Помогите, пожалуйста. Нужна информация о структуре файлов MHC - необходимо вставить возможность выгрузки файлов в этом...

Структура файлов шаблонов
Время от времени просматриваю свежие темы и замечаю, что стали сильно дробить файлы. Ну вот для примера хедер. /** * Hook...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru