Возможно ли хранить сериализованные данные в Java Android APK? (желательно?)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Возможно ли хранить сериализованные данные в Java Android APK? (желательно?)

Сообщение Anonymous »

У меня есть приложение для Android. Я использую большую справочную таблицу. Формат искажен, но давайте представим, что это CSV.
При запуске я считываю данные, выполняю различные проверки, а затем просматриваю данные, чтобы очистить их. После этого приложение запускается.
Теперь я могу сделать одну вещь: как только данные будут очищены, я смогу сериализовать() объект таблицы, а в следующий раз просто прочитать его обратно. Хорошо, но я по-прежнему отправляю необработанные (беспорядочные) данные в приложение. Было бы лучше сериализовать() данные только один раз, при создании apk (на моем компьютере), а затем просто десериализовать() их из «ресурса» в APK (например, через путь к классам

Код: Выделить всё

InputStream stream = res.openRawResource(R.raw.sterilised_object_name))
Но я не понимаю, как это можно сделать? Код (serialize()) может выполняться на виртуальном устройстве, а затем добавляться в APK. Возможно ли такое? и хорошая ли это идея?
----ANS По сути (я надеюсь), что предложил @commonsware ---
Хорошо, я не вижу возможности дать ответ на этом «форуме», поэтому включу ответ здесь:
Итак, я извлек код из приложения Android, которое читало плоские файлы, выполняло очистку
и сохраняло все в TreeMap. Теперь он работает под обычной оболочкой, мы просто
используем пути доступа к файлам Linux, а не ресурсы Android.
Обработку ошибок можно было бы улучшить, но она запускается только (один раз)
разработчиком, и полученный файл встраивается в приложение. Процитируем
оригинальный файл cookie Fortune(1): «Опытный пользователь обычно знает, что делать»
... в конце main() я добавил...

Код: Выделить всё

data_processor.serialize();
if (data_processor.verify())
System.err.println("Serialised data verified OK, data can be found at " + SERIAL_FILE);
else
System.err.println("Serialised data failed to verify");
... затем

Код: Выделить всё

void serialize()  {
try {
FileOutputStream f = new FileOutputStream(SERIAL_FILE);
ObjectOutput     s = new ObjectOutputStream(f);
s.writeObject(map);  // Ourselves
} catch (FileNotFoundException e) {
System.err.println("File Not found in serialize: " + e);
} catch (IOException e) {
System.err.println("IO Error in serialize: " + e);
}
}

 T readAnObject(ObjectInputStream in, Class clazz) throws IOException, ClassNotFoundException {
Object obj = in.readObject(); // Reads as Object
if (clazz.isInstance(obj)) { // Runtime check (optional but good practice)
return clazz.cast(obj);  // Safe cast using the Class object
} else {
throw new ClassCastException("Deserialized object is not of type " + clazz.getName());
}
}

// Deserialise map and verify that it matches the one we wrote out
boolean verify()  {
boolean ok = true;
try {
FileInputStream   in = new FileInputStream(SERIAL_FILE);
ObjectInputStream s  = new ObjectInputStream(in);
// Dammit, it is checked. Due to type erasure we only have the basic type (TreeMap) at runtime
@SuppressWarnings("unchecked")
TreeMap  new_map = readAnObject(s, TreeMap.class);
System.err.println("After deserialise, new map has " + new_map.size() + " entries");
// Now check all the fields match

int new_key = new_map.firstKey();

for(Map.Entry entry : map.entrySet()) {

int key         = entry.getKey();
Golddatum o     = entry.getValue();        // old , the original data
Golddatum n     = new_map.get(new_key);    // new , the deserialised data

if (! is_equal(o, n)) {
System.err.println("Error deserialised data differs: ");
ok = false;
System.exit(1);  // One error is enough

} // if is_equal

Integer new_key_object = new_map.higherKey(new_key);

if (new_key_object == null)
new_key = 0;   // This had better be the last time around the loop, because n (new) has run out of data.  We set to zero so if any more compare are done, they will fail.
else
new_key = new_key_object;;
}  // for

} catch (ClassNotFoundException e) {
System.err.println("Class (TreeMap) not found in serialized data" + e);
} catch (FileNotFoundException e) {
System.err.println("File Not found in serialize" + e);
} catch (IOException e) {
System.err.println("IO Error in serialize" + e);
}

return ok;
}
....
Затем в приложении Android:
Экспортированный сериализованный файл находится в папке:
.../app/src/main/res/raw/gold_treemap
и какой-то очень знакомый код:

Код: Выделить всё

// Deserialize map from disk
boolean deserialise_treemap(MainActivity frame)  {

boolean ok = true;

try {
Resources res = frame.getResources();

InputStream       in = res.openRawResource(R.raw.gold_treemap);
ObjectInputStream s  = new ObjectInputStream(in);

// Dammit, it is checked. Due to type erasure we only have the basic type (TreMap) at runtime
map = this.readAnObject(s, TreeMap.class);

Gold.new_map_size = map.size();
...

Подробнее здесь: https://stackoverflow.com/questions/798 ... -advisable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»