Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Здравствуйте, уважаемые форумчане!
Недавно решил заняться с++ после дельфей и возникло желание/необходимость сделать десериализацию класса. Точнее, нужно, зная имя поля класса, прочитать из файла значение(соответствующее типу поля) и присвоить соответствующему полю. В идеале хочется получить основной код в виде наподобие этого:
Код:

CLoadable Obj =...
char* s = ...
if (Obj.ClassHasProperty(s))
{
...
   Obj.ReadValueFromFile(s,fin);
}
С возможностью наследования от этого класса...

Пытался смотреть примеры в сети, но там во-первых по болшей части про обратный процесс, во-вторых что-то, что я пока из-за низкого знания языка не могу понять... В delphi всё решалось достаточно просто, а вот на плюсах похожих примеров я не нашёл.... Подскажите пожалуйста, как сделать вышеописанное?
Заранее спасибо!
__________________
Изобретатель велосипедов
Selestis вне форума   Ответить с цитированием
Старый 02.02.2011, 11:50   #2
Selestis
Участник клуба
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Адрес: Самара
Сообщений: 719
Репутация: 268
По умолчанию

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

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

Что бы присвоить какие то значения приватному полю(аттрибуту) класса обычно используют метод присвоения например полю класса 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, 15:07   #4
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

Цитата:
молодец, но не понятно что такое десериализация класса?
если не знаете этого то может не стоило отвечать?
Цитата:
Что бы присвоить какие то значения приватному полю(аттрибуту) класса обычно используют метод присвоения например полю класса 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, 16:28   #5
Selestis
Участник клуба
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Адрес: Самара
Сообщений: 719
Репутация: 268
По умолчанию

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

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

Последний раз редактировалось Selestis; 02.02.2011 в 16:34.
Selestis вне форума   Ответить с цитированием
Старый 02.02.2011, 16:40   #6
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


10:28.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru