Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2011, 23:43   #1
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию Десериализация

Здравствуйте, уважаемые форумчане!
Недавно решил заняться с++ после дельфей и возникло желание/необходимость сделать десериализацию класса. Точнее, нужно, зная имя поля класса, прочитать из файла значение(соответствующее типу поля) и присвоить соответствующему полю. В идеале хочется получить основной код в виде наподобие этого:
Код:
CLoadable Obj =...
char* s = ...
if (Obj.ClassHasProperty(s))
{
...
   Obj.ReadValueFromFile(s,fin);
}
С возможностью наследования от этого класса...
Пытался смотреть примеры в сети, но там во-первых по болшей части про обратный процесс, во-вторых что-то, что я пока из-за низкого знания языка не могу понять... В delphi всё решалось достаточно просто, а вот на плюсах похожих примеров я не нашёл.... Подскажите пожалуйста, как сделать вышеописанное?
Заранее спасибо!
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 02.02.2011, 10:50   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Всё ещё актуально
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 02.02.2011, 11:19   #3
GeraZlo
Новичок
Джуниор
 
Регистрация: 30.01.2011
Сообщений: 8
По умолчанию

молодец, но не понятно что такое десериализация класса?

Что бы присвоить какие то значения приватному полю(аттрибуту) класса обычно используют метод присвоения например полю класса int value; в приватном секции, что бы присвоет значение можно применить метод MyClass::SetValue(int a){value = a} метод должен быть объявлен в классе, в его публичной части, а читать из файла есть много разных способов, по этому много примеров.
stdio.h
FILE out;
fopen(out,"file","w+"); ну или что-то типо того, это открытие файлового потока, ну а дальше
fscanf()//синтаксис не помню погляди в библиотеки.

fstream
типы файловых потоков ifstream на чтение с файла, ofstream для вывода, fstream будет таким какой определишь, ну и там смотри в интернете, лень сейчас искать.
GeraZlo вне форума Ответить с цитированием
Старый 02.02.2011, 14:07   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
молодец, но не понятно что такое десериализация класса?
если не знаете этого то может не стоило отвечать?
Цитата:
Что бы присвоить какие то значения приватному полю(аттрибуту) класса обычно используют метод присвоения например полю класса int value; в приватном секции, что бы присвоет значение можно применить метод MyClass::SetValue(int a){value = a} метод должен быть объявлен в классе, в его публичной части
если десерилиализация это метод класса то он отлично будет иметь к приватным полям доступ.

Selestis, у меня лично при иерархии классов:
Код:
class Object;
class Stream:public Object;
class String:public Object;
у класса Object объявил виртуальные пустые(то есть не делающую ничего, но не абстрактную) функции
virtual signed long long Serialize(Stream*dest);
virtual signed long long DeSerialize(Stream*source);

далее классы Stream и String переопределяют их, так как надо(у меня просто каждый тип класса еще сохраняет свою метку, чтоб было возможным проверить данные при обратной загрузке, сохраняю бинарно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.02.2011, 15:28   #5
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Пепел Феникса, вы сказали что у вас у классов есть переопределенные функции загрузки из потока, а как собственно они устроены? Т.е. не писать же для каждого класса по очереди присвоение всех полей, иначе сам смысл этого немного теряется... Или я что-то не так понял?

P.S. Может я неверно выразился в 1 посте... По сути, то что мне нужно - это зная строку(имя поля), присвоить значение отдельному полю... Десериализовать весь объект вобщем-то не требуется. Предполагается, что в файле есть список поле-значение объекта, причем не все и не подряд. Вот как-то так....
Изобретатель велосипедов

Последний раз редактировалось Selestis; 02.02.2011 в 15:34.
Selestis вне форума Ответить с цитированием
Старый 02.02.2011, 15:40   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Т.е. не писать же для каждого класса по очереди присвоение всех полей, иначе сам смысл этого немного теряется... Или я что-то не так понял?
у меня не присвоение всех полей, а только нужных, для строки это количество символов и затем данные.(но там еще метка кодировщика есть, если сохранено не в UTF16LE)
для потока размер данных и собственно данные.
Цитата:
P.S. Может я неверно выразился в 1 посте... По сути, то что мне нужно - это зная строку(имя поля), присвоить значение отдельному полю...
тут надо к RTTI обращатся, может в Boost есть чтото подобное...а так не знаю
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.02.2011, 16:02   #7
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Цитата:
тут надо к RTTI обращатся, может в Boost есть чтото подобное...а так не знаю
Выходит так. Спасибо, посмотрю буст.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сериализация в одной программе и десериализация в другой Casper-SC Общие вопросы .NET 5 30.05.2010 20:31
C# и Xml десериализация DeCo Общие вопросы .NET 2 17.03.2010 00:55
сериализация и десериализация radiantor Работа с сетью в Delphi 7 02.08.2008 00:27