Возможна ли на с++ сериализация как в Java?

Тема в разделе "WASM.HEAP", создана пользователем device, 24 дек 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Есть некоторый класс FileEntity (Java), который содержит приватные поля (FileName, FileSize...etc)

    Есть другой класс(Java):
    Код (Text):
    1.     @OneToOne(mappedBy = "User_Entity")
    2.     private FileEntity fileEntity; //Указатель OneToOne --- Экземпляр FileEntity
    3. // Можно получить индекс объекта и его адрес!!! а е просто экземпляр класса.
    4.  
    5.     @Id
    6.     @GeneratedValue(strategy = GenerationType.AUTO)
    Здесь fileEntity не просто создает экземпляр класса FileEntity, а указывает на одноименную структуру, то есть на ее адрес.

    Можно ли на с++ именно указать на сущность, а не просто создать ее экземпляр. Что можно почитать про сериализацию на C++ и возможна ли она?
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    device,
    может я тебя не совсем верно понял, но в С++ есть reinterpret_cast operator:
    reinterpret_cast<T> (expr).

    тем самым можно к примеру с его помощью получить адрес инстанциированного объекта, или адрес члена класса или его ф-ции-члена, и на static ф-ции-члены в том числе.

    вот пример:
    Код (Text):
    1. #include <iomanip>
    2. #include <iostream>
    3.  
    4. using namespace std;
    5.  
    6. class A
    7. {
    8.     public:
    9.         A(){ ; }
    10.         ~A(){ ; }
    11.         void write() { printf("hello, world!\n"); }
    12.                 static void foo() { ; }  //статическая ф-ция-член для всех классов A
    13. };
    14.  
    15. int main()
    16. {
    17.     A a;
    18.     int address = reinterpret_cast<int>(&a);
    19.  
    20.     cout << setfill('x') << showbase << hex << internal;
    21.     cout << "a address = " << setw(10) << address << endl;
    22.  
    23.     void (A::*fp)(void) = &A::write;
    24.     address = reinterpret_cast<int>(&fp);
    25.     cout << "A::write address = " << setw(10) << address << endl;
    26.  
    27.         static void (A::*fpnext)(void) = &A::write;
    28.     address = reinterpret_cast<int>(&fpnext);
    29.     cout << "A::foo address = " << setw(10) << address << endl;
    30.  
    31.     return 0;
    32. }
    вывод:
    сериализация в С++ ессно имеется, про это на том же codeproject.com статьи видел, затем у Мейерса что-то такое тоже вроде есть, в общем, тема не экзотическая, материал найти можно.
     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Почти оно.
    Насчет сериализации - я просто не знал как в C++ оно называется. Я же не буду в гугл писать "C++ сериализация как в Java" - он меня просто не поймет:)
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    можно даже обойтись без reinterpret_cast, и просто юзать как в Си указатели на ф-ции (то же самое применимо и к получению адресов членов классов, как в посте выше):
    Код (Text):
    1. void foo()
    2. {
    3.     printf("foo\n");
    4. }
    5.  
    6. int main()
    7. {
    8.     void (*pfoo)(void) = &foo;
    9.     printf("foo address = %p\n", (void*)pfoo);
    10.  
    11.     return 0;
    12. }
    ps: а сериализация и в С++ сериализацией. по крайней мере на некоторых серьезных программерских сайтах о С++ я много раз видел этот термин.
     
  5. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Просто в Java нельзя написать:

    Object *obj

    Но есть обходной путь
    Код (Text):
    1. @OneToOne(mappedBy = "Object")
    2. Object obj
    это равносильно в С++ Object *obj, однако в Java после таких операций становятся доступны такие фичи как
    @id и strategy, чего я и хочу добиться от C++.

    Я занялся исследованием этих фич для расширения языка Java и C++ в обход JNI и CNI.
    Если я правильно понимаю, то доступ к адресному пространству - штука достаточно интересная.
    Что будет, например, если мне удастся подменить у клиента стандартную jvm на мою, с дырявой защитой?
     
  6. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    device,
    а про @id и strategy применительно к С++ поподробней плиз?
    или я не так мысль понял, т.к. в С++ нет таких фич.
     
  7. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Ну... когда получаешь ссылку на объект, то для удобства управления ему (объекту) присваивается уникальный номер - ID. Этот ID можно прописывать вручную, а можно использовать Strategy, которая будет инкременировать ID. Это работает как в MySQL auto_increment и primary key (id).
    Я начал читать документацию по C++ на эту тему. Там сказано, что наиболее распространенным способом сериализации является рекурсивный обход public интерфейса объекта, после чего создаются соответствующие узлы. Я не хочу изобретать на С++ уже изобретенный алгоритм сериализации, но хочу узнать, можно ли применять ID и Strategy.

    Пример.
    Мне нужно узнать, кто имеет право на запись в файл, и если узнаю, выдернуть пароль этого юзера.
    Написать на Java.

    1способ: JNI: native String GetUserPassword, которая ссылается на соотв. функцию в сишной библиотеке.
    2 способ:
    Написать прогу на си++ для выдергивания пароля у юзера, оформить операции в виде класса, применить сериализацию, получить ссылку на адрес этого класса.
    Написать прогу на Java, которая просто воспользуется ссылкой на адрес и будет оперировать с сишным классом.
    1 способ при попытке запуска на клиентской тачке вызовет предупреждение (если клиент бдительный) о том, что используются опасные нативные методы
    2 способ не вызовет ничего.
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    device
    Тут не совсем уместно сравнивать сериализуемость нативного(С++)
    и интерпритируемого(Java).
    В яве есть механизм рефлекции, в котором в реал-тайм можно пролистать
    все доступные свойства любого класса и их типы.Поэтому в ява сериализация
    примитивно реализуется в самой jvm, из-за своей интарпретаторской природы:)

    А в сях ,так как там, [:|||||||||:] (большой баян)
    Нужно в каждом классе самому реализовывать
    сериалайз и десериалайз.И при наследовании
    в ручную папины методы дёргать.

    P.S. Не подскажеш чем сериализация от маршалинга отличается?
    По мне - так игра слов.А другие разные гипотезы толкают.
    Не шутка, правда интересно.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    device
    Интересно, как это? С++ — статический язык, в рантайме нет никакой информации, позволяющей "рекурсивный обход public интерфейса объекта". Имелась ввиду Java? Или managed C++?

    По поводу сериализации в С++ — автоматически никак. Только ручная (#8) или полуавтоматическая (карты, макросы, etc.) сериализация данных.

    wsd
    Тут.
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    IceStudent
    Огромное спасибо!
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    для сериализации на С++ можно обратить свой взор на boost:
     
  12. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Сколько не запускал своих JNI-программ (не апплетов) ни разу не видел никаких предупреждений. Ведь стандартная java-библиотека без JNI обойтись не может.
     
  13. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Ну а куда она денется?


    Это смотря куда лезть из JNI...
    Попробуй с обычными правами узнать пароль у одного из пользователей системы, чтобы передать его, например, по почте!
     
  14. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Если ты лезешь из JNI в ядро (я, кстати, недавно так делал ;) ), то любые предупреждения - это уже не проблема java. Они будут и в полностью нативной программе. Опять же никаких предупреждений при загрузке драйверов (под админом, а иначе их вообще не загрузишь) я еще не видел. Если же вы в свою прогу трояны засовываете, то наверно сможете и изменить код так, чтобы он не опозновался антивирусом.
    PS Надеюсь вы знаете, что при сериализации исполнимый код класса не сохраняется (по крайней мере у нормальных людей).
    PSPS А как это вы с обычными правами пароли узнаете? Неужто нашли дырку с повышением привилегий?
     
  15. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    halyavin
    Там слияние приложений JNI и CNI.
    CNI лезет с административными правами куда надо (кстати, как скрыть процесс?), а JNI уже от имени обычного юзера просто пользуется моментом.