Как преобразовать карту в байты и сохранить во внутреннем хранилище - PullRequest
7 голосов
/ 15 декабря 2011

Как я могу преобразовать мой Map<Integer, String> в byte[], а затем записать его во внутреннюю память?В настоящее время у меня есть:

        try {
            FileOutputStream fos = context.openFileOutput(Const.FILE_CATEGORIES, Context.MODE_PRIVATE);
            fos.write(null);
        } catch (FileNotFoundException e) {
            // reload and create the file again
        }

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

Ответы [ 3 ]

16 голосов
/ 15 декабря 2011
  1. Используя сериализацию в Java, вы можете легко разобрать любой сериализуемый объекты в поток байтов. Попробуйте использовать ObjectInputStream и ObjectOuputStream.

  2. Используйте json для восстановления. Вы можете использовать google-gson для конвертации Java объекты в JSON и наоборот.

  3. Использование посылки в Android. Класс android.os.Parcel предназначен для передачи данных. между компонентами в Android (активность, сервис), но вы все равно можете использовать его для сохранения данных. Только помните, не отправляйте данные в интернет, так как Платформы могут иметь другой алгоритм для анализа.

Я написал демо для сериализации, попробуйте.

public static void main(String[] args) throws Exception {
    // Create raw data.
    Map<Integer, String> data = new HashMap<Integer, String>();
    data.put(1, "hello");
    data.put(2, "world");
    System.out.println(data.toString());

    // Convert Map to byte array
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(byteOut);
    out.writeObject(data);

    // Parse byte array to Map
    ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
    ObjectInputStream in = new ObjectInputStream(byteIn);
    Map<Integer, String> data2 = (Map<Integer, String>) in.readObject();
    System.out.println(data2.toString());
}
1 голос
/ 25 мая 2019

Я знаю, что подписываюсь на старую ветку, но она появилась в моем поиске в Google. Поэтому я оставлю свои 5 центов здесь:

Вы можете использовать org.apache.commons.lang3.SerializationUtils , который имеет два следующих метода:

/**
 * Serialize the given object to a byte array.
 * @param object the object to serialize
 * @return an array of bytes representing the object in a portable fashion
 */
public static byte[] serialize(Object object);

/**
 * Deserialize the byte array into an object.
 * @param bytes a serialized object
 * @return the result of deserializing the bytes
 */
public static Object deserialize(byte[] bytes);
0 голосов
/ 15 декабря 2011

Либо сериализуйте, как уже упоминалось, либо используйте собственный механизм для сохранения и загрузки вашей карты.Сохраняя, вы перебираете все элементы и сохраняете пары ключ-значение.При загрузке вы добавляете их обратно.Преимущество реализации собственного механизма заключается в том, что вы все равно можете использовать свои постоянные значения, когда ваша программа используется с другой версией Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...