Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用文件的情况下序列化对象(比如HashMap)?_Java_Android_Object_Serialization - Fatal编程技术网

Java 如何在不使用文件的情况下序列化对象(比如HashMap)?

Java 如何在不使用文件的情况下序列化对象(比如HashMap)?,java,android,object,serialization,Java,Android,Object,Serialization,问题: 我目前正在为Android API级别19编写一个应用程序(是的,我知道它很旧)。我遇到了序列化设置数据的问题。部分问题在于某些数据是机密的,必须在写入磁盘之前进行加密。因此,存在加密和未加密数据的混合。数据由int、Boolean、String、byte[]和其他类型组成 对于那些感兴趣的人,当应用程序启动时,用户必须输入他们的PIN。PIN通过哈希算法运行了几次。在运行的中间,它们被加密密钥,然后散列循环运行完成。所以中间结果是关键,最终结果是验证。验证将写入设置文件,而密钥用于加密

问题:

我目前正在为Android API级别19编写一个应用程序(是的,我知道它很旧)。我遇到了序列化设置数据的问题。部分问题在于某些数据是机密的,必须在写入磁盘之前进行加密。因此,存在加密和未加密数据的混合。数据由int、Boolean、String、byte[]和其他类型组成

对于那些感兴趣的人,当应用程序启动时,用户必须输入他们的PIN。PIN通过哈希算法运行了几次。在运行的中间,它们被加密密钥,然后散列循环运行完成。所以中间结果是关键,最终结果是验证。验证将写入设置文件,而密钥用于加密或解密机密数据。还有其他保障措施,但简而言之就是这样

我发现的大多数实现都使用HashMap和ObjectOutputStream,由于密码问题(根据我到目前为止看到的示例),它们无法使用。我确实在Android开发者文档中遇到过数据类,但是Android Studio说它需要使用API 29

研究:

我在不同的地方找到了很多答案,例如:


…和许多其他的,但我不能真正使用它们,因为我正在尝试这样做。

您可以通过cipheroutputstream写入和读取数据 .

CipherOutputStream为您加密数据。您可以使用CipherInputStream对其进行解密


您必须将cipheroutputstream放在对象流和文件流之间。

您特别提出的问题的答案是:

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  ObjectOuputStream oos = new ObjectOuputStream(baos);

  oos.writeObject(someObject);
  oos.close();

  byte[] serialized = baos.toByteArray();
这将序列化为字节数组。没有使用任何文件。然后可以在写入序列化之前对其进行加密。。。使用您选择的任何加密方案

但是,更好的办法是将加密放入输出管道中;e、 g

  FileOutputStream fos = new FileOutputStream(path);
  Cipher c = ...
  CipherOutputStream cos = new CipherOutputStream(fos, c);
  ObjectOuputStream oos = new ObjectOuputStream(baos);

  oos.writeObject(someObject);
  oos.close();

序列化将在写入文件系统之前进行加密。

由于加密和未加密数据的混合,我无法这样做。某些信息必须保持未加密状态。否则我会在加密链接中使用Android开发者文档中的文件代码,这是我在上述研究中提供的一部分。请考虑一下你的结构。为什么将加密数据和未加密数据混合在一起?如果有必要,请提取应加密的数据并将其加密写入磁盘。可以不加密保存的数据可以不加密存储。如果加载数据,则对加密数据进行解密,并将其与未加密数据混合在一起。我不明白你的问题。问题是你没有回答问题。我问了一种不用文件序列化对象的方法。公认的答案就是这样。我意识到加密问题是一个骗局。然而,它解释了我做我正在做的事情的动机。我本可以使用两个文件:一个用于公共数据,一个用于私人数据,但我不想处理两个文件的麻烦。这似乎是正确的答案。但是,我认为OutputStream应该是ByTearrayOutStream,而不是OutputStream,因为OutputStream没有toByteArray方法。我现在正在做这个。一旦我确认,我会将此标记为接受答案。是。我的错误。固定的。