文件对象序列化

时间:2016-01-23 06:13:06

标签: java file serialization objectoutputstream

我有一个客户端服务器程序,我需要序列化文件对象并将其发送到客户端。

在服务器端:

{
  "name": "Bla Bla",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "A description",
  "homepage_url": "https://aaa.org",
  "icons": 
  {
    "16": "icons/lock_red16.png",
    "48": "icons/lock_red48.png",
    "128": "icons/lock_red128.png"
  },
  "default_locale": "en",
  "background": 
  {
    "scripts": 
    [      
      "js/lib/jserror/jserror.js",
      "js/lib/lang/languagedb.js",

      "js/lib/lz77.js",
      "js/lib/pcrypt.js",
      "js/lib/pcryptapi.js",

      "js/lib/forge.bundle.js",
      "js/lib/elliptic.js",

      "js/lib/srp6a/biginteger.js",
      "js/lib/srp6a/isaac.js",
      "js/lib/srp6a/random.js",
      "js/lib/srp6a/sha256.js",
      "js/lib/srp6a/thinbus-srp6client.js",
      "js/lib/srp6a/thinbus-srp-config.js", 
      "js/lib/srp6a/thinbus-srp6a-config-sha256.js",

      "js/pcrypt_shared.js",      
      "js/pcrypt_extension.js",

      "src/bg/background.js"
    ],
    "persistent": true
  },
  "browser_action": 
  {
    "default_icon": 
    {
      "16": "icons/lock_red16.png",
      "48": "icons/lock_red48.png",
      "128": "icons/lock_red128.png"    
    },
    "default_title": "Password Crypt",
    "default_popup": "src/browser_action/popup.html"
  },
  "permissions": 
  [
    "clipboardWrite",
    "storage"
  ],
  "content_scripts": 
  [
    {
      "matches": 
      [
        "http://*/*",
        "https://*/*"
      ],
      "js": 
      [
        "js/pcrypt_extension.js",

        "src/inject/inject.js"
      ]
    }
  ],
  "externally_connectable":
  {
    "matches": 
    [
        "https://*.aaa.dk/*",
        "https://*.aaa.org/*"
    ]
  },
  "web_accessible_resources": 
  [
    "icons/*.png"
  ],
  "applications": 
  {
    "gecko": 
    {
      "id": "benny@aaa.dk",
      "strict_min_version": "40.0.0",
      "strict_max_version": "50.*",
      "update_url": "https://aaa.org/addon"
    }
  }
}

在客户端:

FileInputStream input_file = new FileInputStream(file);
object_output_stream.writeObject(input_file);

我需要序列化input_file对象并将其发送到客户端。 ObjectOutputStream和ObjectInputStream是Non-Serializable。最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

您无法序列化文件 - 这意味着客户端可以从服务器上的文件中读取,这需要一个复杂的协议,而这种协议在Java序列化机制中根本不存在。

您最好的方法是将文件中的数据读入字节数组,然后将字节数组明确地发送到客户端,或者在ObjectOutputStream中序列化字节数组(如果您愿意,可以这样做)发送其他对象)

您可以使用apache-commons IOUtils.toByteArray(InputStream input)轻松地将文件读入byte[]

在服务器端:

FileInputStream input_file = new FileInputStream(file);
byte[] input_data = IOUtils.toByteArray(input_file);
object_output_stream.writeObject(input_data);

在客户端:

FileOutputStream output_file = new FileOutputStream(new File(filename));
byte[] input_data = (byte[]) object_input_stream.readObject();
output_file.write(input_data);