Есть некоторый класс FileEntity (Java), который содержит приватные поля (FileName, FileSize...etc) Есть другой класс(Java): Код (Text): @OneToOne(mappedBy = "User_Entity") private FileEntity fileEntity; //Указатель OneToOne --- Экземпляр FileEntity // Можно получить индекс объекта и его адрес!!! а е просто экземпляр класса. @Id @GeneratedValue(strategy = GenerationType.AUTO) Здесь fileEntity не просто создает экземпляр класса FileEntity, а указывает на одноименную структуру, то есть на ее адрес. Можно ли на с++ именно указать на сущность, а не просто создать ее экземпляр. Что можно почитать про сериализацию на C++ и возможна ли она?
device, может я тебя не совсем верно понял, но в С++ есть reinterpret_cast operator: reinterpret_cast<T> (expr). тем самым можно к примеру с его помощью получить адрес инстанциированного объекта, или адрес члена класса или его ф-ции-члена, и на static ф-ции-члены в том числе. вот пример: Код (Text): #include <iomanip> #include <iostream> using namespace std; class A { public: A(){ ; } ~A(){ ; } void write() { printf("hello, world!\n"); } static void foo() { ; } //статическая ф-ция-член для всех классов A }; int main() { A a; int address = reinterpret_cast<int>(&a); cout << setfill('x') << showbase << hex << internal; cout << "a address = " << setw(10) << address << endl; void (A::*fp)(void) = &A::write; address = reinterpret_cast<int>(&fp); cout << "A::write address = " << setw(10) << address << endl; static void (A::*fpnext)(void) = &A::write; address = reinterpret_cast<int>(&fpnext); cout << "A::foo address = " << setw(10) << address << endl; return 0; } вывод: сериализация в С++ ессно имеется, про это на том же codeproject.com статьи видел, затем у Мейерса что-то такое тоже вроде есть, в общем, тема не экзотическая, материал найти можно.
Почти оно. Насчет сериализации - я просто не знал как в C++ оно называется. Я же не буду в гугл писать "C++ сериализация как в Java" - он меня просто не поймет
можно даже обойтись без reinterpret_cast, и просто юзать как в Си указатели на ф-ции (то же самое применимо и к получению адресов членов классов, как в посте выше): Код (Text): void foo() { printf("foo\n"); } int main() { void (*pfoo)(void) = &foo; printf("foo address = %p\n", (void*)pfoo); return 0; } ps: а сериализация и в С++ сериализацией. по крайней мере на некоторых серьезных программерских сайтах о С++ я много раз видел этот термин.
Просто в Java нельзя написать: Object *obj Но есть обходной путь Код (Text): @OneToOne(mappedBy = "Object") Object obj это равносильно в С++ Object *obj, однако в Java после таких операций становятся доступны такие фичи как @id и strategy, чего я и хочу добиться от C++. Я занялся исследованием этих фич для расширения языка Java и C++ в обход JNI и CNI. Если я правильно понимаю, то доступ к адресному пространству - штука достаточно интересная. Что будет, например, если мне удастся подменить у клиента стандартную jvm на мою, с дырявой защитой?
device, а про @id и strategy применительно к С++ поподробней плиз? или я не так мысль понял, т.к. в С++ нет таких фич.
Ну... когда получаешь ссылку на объект, то для удобства управления ему (объекту) присваивается уникальный номер - ID. Этот ID можно прописывать вручную, а можно использовать Strategy, которая будет инкременировать ID. Это работает как в MySQL auto_increment и primary key (id). Я начал читать документацию по C++ на эту тему. Там сказано, что наиболее распространенным способом сериализации является рекурсивный обход public интерфейса объекта, после чего создаются соответствующие узлы. Я не хочу изобретать на С++ уже изобретенный алгоритм сериализации, но хочу узнать, можно ли применять ID и Strategy. Пример. Мне нужно узнать, кто имеет право на запись в файл, и если узнаю, выдернуть пароль этого юзера. Написать на Java. 1способ: JNI: native String GetUserPassword, которая ссылается на соотв. функцию в сишной библиотеке. 2 способ: Написать прогу на си++ для выдергивания пароля у юзера, оформить операции в виде класса, применить сериализацию, получить ссылку на адрес этого класса. Написать прогу на Java, которая просто воспользуется ссылкой на адрес и будет оперировать с сишным классом. 1 способ при попытке запуска на клиентской тачке вызовет предупреждение (если клиент бдительный) о том, что используются опасные нативные методы 2 способ не вызовет ничего.
device Тут не совсем уместно сравнивать сериализуемость нативного(С++) и интерпритируемого(Java). В яве есть механизм рефлекции, в котором в реал-тайм можно пролистать все доступные свойства любого класса и их типы.Поэтому в ява сериализация примитивно реализуется в самой jvm, из-за своей интарпретаторской природы А в сях ,так как там, [:|||||||||:] (большой баян) Нужно в каждом классе самому реализовывать сериалайз и десериалайз.И при наследовании в ручную папины методы дёргать. P.S. Не подскажеш чем сериализация от маршалинга отличается? По мне - так игра слов.А другие разные гипотезы толкают. Не шутка, правда интересно.
device Интересно, как это? С++ — статический язык, в рантайме нет никакой информации, позволяющей "рекурсивный обход public интерфейса объекта". Имелась ввиду Java? Или managed C++? По поводу сериализации в С++ — автоматически никак. Только ручная (#8) или полуавтоматическая (карты, макросы, etc.) сериализация данных. wsd Тут.
Сколько не запускал своих JNI-программ (не апплетов) ни разу не видел никаких предупреждений. Ведь стандартная java-библиотека без JNI обойтись не может.
Ну а куда она денется? Это смотря куда лезть из JNI... Попробуй с обычными правами узнать пароль у одного из пользователей системы, чтобы передать его, например, по почте!
Если ты лезешь из JNI в ядро (я, кстати, недавно так делал ), то любые предупреждения - это уже не проблема java. Они будут и в полностью нативной программе. Опять же никаких предупреждений при загрузке драйверов (под админом, а иначе их вообще не загрузишь) я еще не видел. Если же вы в свою прогу трояны засовываете, то наверно сможете и изменить код так, чтобы он не опозновался антивирусом. PS Надеюсь вы знаете, что при сериализации исполнимый код класса не сохраняется (по крайней мере у нормальных людей). PSPS А как это вы с обычными правами пароли узнаете? Неужто нашли дырку с повышением привилегий?
halyavin Там слияние приложений JNI и CNI. CNI лезет с административными правами куда надо (кстати, как скрыть процесс?), а JNI уже от имени обычного юзера просто пользуется моментом.