{"id":50732,"date":"2023-12-23T10:31:39","date_gmt":"2023-12-23T02:31:39","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/"},"modified":"2023-12-23T15:31:29","modified_gmt":"2023-12-23T07:31:29","slug":"java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/","title":{"rendered":"Java\u4e2d\u7684\u5e8f\u5217\u5316 &#8211; Java\u5e8f\u5217\u5316"},"content":{"rendered":"<p>\u5728Java\u4e2d\uff0c\u5e8f\u5217\u5316\u662f\u5728JDK 1.1\u4e2d\u5f15\u5165\u7684\uff0c\u5b83\u662f\u6838\u5fc3Java\u7684\u91cd\u8981\u529f\u80fd\u4e4b\u4e00\u3002<\/p>\n<h2>Java\u4e2d\u7684\u5e8f\u5217\u5316<\/h2>\n<p>\u5728Java\u4e2d\u7684\u5e8f\u5217\u5316\u53ef\u4ee5\u5c06\u4e00\u4e2a\u5bf9\u8c61\u8f6c\u5316\u4e3a\u6d41\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u7f51\u7edc\u53d1\u9001\u3001\u4fdd\u5b58\u4e3a\u6587\u4ef6\u6216\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\u4ee5\u4fbf\u540e\u7eed\u4f7f\u7528\u3002\u53cd\u5e8f\u5217\u5316\u5219\u662f\u5c06\u5bf9\u8c61\u6d41\u8f6c\u5316\u4e3a\u5b9e\u9645\u7684Java\u5bf9\u8c61\uff0c\u4ee5\u4f9b\u7a0b\u5e8f\u4f7f\u7528\u3002\u8d77\u521d\uff0cJava\u4e2d\u7684\u5e8f\u5217\u5316\u4f3c\u4e4e\u5f88\u5bb9\u6613\u4f7f\u7528\uff0c\u4f46\u5b83\u4e5f\u5b58\u5728\u4e00\u4e9b\u7ec6\u5fae\u7684\u5b89\u5168\u548c\u5b8c\u6574\u6027\u95ee\u9898\uff0c\u6211\u4eec\u5c06\u5728\u672c\u6587\u7684\u540e\u534a\u90e8\u5206\u8fdb\u884c\u8ba8\u8bba\u3002\u672c\u6559\u7a0b\u5c06\u6db5\u76d6\u4ee5\u4e0b\u4e3b\u9898\u3002<\/p>\n<ol>\u5728Java\u4e2d\u53ef\u5e8f\u5217\u5316<br \/>\n\u5229\u7528\u5e8f\u5217\u5316\u548cserialVersionUID\u8fdb\u884c\u7c7b\u91cd\u6784<br \/>\nJava\u7684Externalizable\u63a5\u53e3<br \/>\nJava\u7684\u5e8f\u5217\u5316\u65b9\u6cd5<br \/>\n\u7ee7\u627f\u4e2d\u7684\u5e8f\u5217\u5316<br \/>\n\u5e8f\u5217\u5316\u4ee3\u7406\u6a21\u5f0f<\/ol>\n<h3>\u5728Java\u4e2d\u53ef\u5e8f\u5217\u5316<\/h3>\n<p>\u5982\u679c\u4f60\u60f3\u8ba9\u4e00\u4e2a\u7c7b\u5bf9\u8c61\u53ef\u5e8f\u5217\u5316\uff0c\u4f60\u53ea\u9700\u8981\u5b9e\u73b0java.io.Serializable\u63a5\u53e3\u3002\u5728Java\u4e2d\uff0cSerializable\u662f\u4e00\u4e2a\u6807\u8bb0\u63a5\u53e3\uff0c\u6ca1\u6709\u9700\u8981\u5b9e\u73b0\u7684\u5b57\u6bb5\u6216\u65b9\u6cd5\u3002\u5b83\u7c7b\u4f3c\u4e8e\u4e00\u4e2aOpt-In\u8fc7\u7a0b\uff0c\u901a\u8fc7\u5b83\u4f7f\u6211\u4eec\u7684\u7c7b\u53ef\u5e8f\u5217\u5316\u3002Java\u4e2d\u7684\u5e8f\u5217\u5316\u662f\u7531ObjectInputStream\u548cObjectOutputStream\u5b9e\u73b0\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u53ea\u9700\u8981\u4e00\u4e2a\u5bf9\u5b83\u4eec\u7684\u5305\u88c5\u5668\uff0c\u4ee5\u4fbf\u5c06\u5176\u4fdd\u5b58\u5230\u6587\u4ef6\u6216\u901a\u8fc7\u7f51\u7edc\u53d1\u9001\u3002\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e2a\u7b80\u5355\u7684Java\u5e8f\u5217\u5316\u7a0b\u5e8f\u793a\u4f8b\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization;\r\n\r\nimport java.io.Serializable;\r\n\r\npublic class Employee implements Serializable {\r\n\r\n\/\/\tprivate static final long serialVersionUID = -6470090944414208496L;\r\n\t\r\n\tprivate String name;\r\n\tprivate int id;\r\n\ttransient private int salary;\r\n\/\/\tprivate String password;\r\n\t\r\n\t@Override\r\n\tpublic String toString(){\r\n\t\treturn \"Employee{name=\"+name+\",id=\"+id+\",salary=\"+salary+\"}\";\r\n\t}\r\n\t\r\n\t\/\/getter and setter methods\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\r\n\tpublic int getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(int id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic int getSalary() {\r\n\t\treturn salary;\r\n\t}\r\n\r\n\tpublic void setSalary(int salary) {\r\n\t\tthis.salary = salary;\r\n\t}\r\n\r\n\/\/\tpublic String getPassword() {\r\n\/\/\t\treturn password;\r\n\/\/\t}\r\n\/\/\r\n\/\/\tpublic void setPassword(String password) {\r\n\/\/\t\tthis.password = password;\r\n\/\/\t}\r\n\t\r\n}\r\n<\/code><\/pre>\n<p>\u8bf7\u6ce8\u610f\uff0c\u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684Java Bean\uff0c\u5b83\u5305\u542b\u4e00\u4e9b\u5c5e\u6027\u548c\u83b7\u53d6\u5668-\u8bbe\u7f6e\u5668\u65b9\u6cd5\u3002\u5982\u679c\u4f60\u60f3\u8ba9\u4e00\u4e2a\u5bf9\u8c61\u5c5e\u6027\u4e0d\u88ab\u5e8f\u5217\u5316\u5230\u6d41\u4e2d\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528transient\u5173\u952e\u5b57\uff0c\u5c31\u50cf\u6211\u5728salary\u53d8\u91cf\u4e2d\u6240\u505a\u7684\u4e00\u6837\u3002\u73b0\u5728\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u5c06\u6211\u4eec\u7684\u5bf9\u8c61\u5199\u5165\u6587\u4ef6\uff0c\u7136\u540e\u4ece\u540c\u4e00\u6587\u4ef6\u4e2d\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4f7f\u7528ObjectInputStream\u548cObjectOutputStream\u8fdb\u884c\u5e8f\u5217\u5316\u7684\u5b9e\u7528\u65b9\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization;\r\n\r\nimport java.io.FileInputStream;\r\nimport java.io.FileOutputStream;\r\nimport java.io.IOException;\r\nimport java.io.ObjectInputStream;\r\nimport java.io.ObjectOutputStream;\r\n\r\n\/**\r\n * A simple class with generic serialize and deserialize method implementations\r\n * \r\n * @author pankaj\r\n * \r\n *\/\r\npublic class SerializationUtil {\r\n\r\n\t\/\/ deserialize to Object from given file\r\n\tpublic static Object deserialize(String fileName) throws IOException,\r\n\t\t\tClassNotFoundException {\r\n\t\tFileInputStream fis = new FileInputStream(fileName);\r\n\t\tObjectInputStream ois = new ObjectInputStream(fis);\r\n\t\tObject obj = ois.readObject();\r\n\t\tois.close();\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t\/\/ serialize the given object and save it to file\r\n\tpublic static void serialize(Object obj, String fileName)\r\n\t\t\tthrows IOException {\r\n\t\tFileOutputStream fos = new FileOutputStream(fileName);\r\n\t\tObjectOutputStream oos = new ObjectOutputStream(fos);\r\n\t\toos.writeObject(obj);\r\n\r\n\t\tfos.close();\r\n\t}\r\n\r\n}\r\n<\/code><\/pre>\n<p>\u8bf7\u6ce8\u610f\uff0c\u65b9\u6cd5\u53c2\u6570\u4f7f\u7528\u7684\u662f\u4efb\u4f55java\u5bf9\u8c61\u7684\u57fa\u7c7bObject\u3002\u8fd9\u6837\u7f16\u5199\u7684\u76ee\u7684\u662f\u4e3a\u4e86\u5177\u6709\u901a\u7528\u6027\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u7f16\u5199\u4e00\u4e2a\u6d4b\u8bd5\u7a0b\u5e8f\u6765\u770b\u770bJava\u5e8f\u5217\u5316\u7684\u5de5\u4f5c\u539f\u7406\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization;\r\n\r\nimport java.io.IOException;\r\n\r\npublic class SerializationTest {\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString fileName=\"employee.ser\";\r\n\t\tEmployee emp = new Employee();\r\n\t\temp.setId(100);\r\n\t\temp.setName(\"Pankaj\");\r\n\t\temp.setSalary(5000);\r\n\t\t\r\n\t\t\/\/serialize to file\r\n\t\ttry {\r\n\t\t\tSerializationUtil.serialize(emp, fileName);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\tEmployee empNew = null;\r\n\t\ttry {\r\n\t\t\tempNew = (Employee) SerializationUtil.deserialize(fileName);\r\n\t\t} catch (ClassNotFoundException | IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\t\r\n\t\tSystem.out.println(\"emp Object::\"+emp);\r\n\t\tSystem.out.println(\"empNew Object::\"+empNew);\r\n\t}\r\n}\r\n<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u5728Java\u4e2d\u8fd0\u884c\u4e0a\u8ff0\u7684\u6d4b\u8bd5\u7a0b\u5e8f\u8fdb\u884c\u5e8f\u5217\u5316\u65f6\uff0c\u6211\u4eec\u5f97\u5230\u4ee5\u4e0b\u8f93\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code>emp Object::Employee{name=Pankaj,id=100,salary=5000}\r\nempNew Object::Employee{name=Pankaj,id=100,salary=0}\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u85aa\u6c34\u662f\u4e00\u4e2a\u4e34\u65f6\u53d8\u91cf\uff0c\u5176\u503c\u5e76\u6ca1\u6709\u4fdd\u5b58\u5230\u6587\u4ef6\u4e2d\uff0c\u56e0\u6b64\u5728\u65b0\u5bf9\u8c61\u4e2d\u65e0\u6cd5\u68c0\u7d22\u5230\u3002\u540c\u6837\uff0c\u9759\u6001\u53d8\u91cf\u7684\u503c\u4e5f\u4e0d\u4f1a\u88ab\u5e8f\u5217\u5316\uff0c\u56e0\u4e3a\u5b83\u4eec\u5c5e\u4e8e\u7c7b\u800c\u4e0d\u662f\u5bf9\u8c61\u3002<\/p>\n<h3>\u4f7f\u7528\u5e8f\u5217\u5316\u548cserialVersionUID\u91cd\u6784\u7c7b<\/h3>\n<p>\u5982\u679c\u53ef\u4ee5\u88ab\u5ffd\u7565\u7684\u8bdd\uff0c\u5728Java\u4e2d\u8fdb\u884c\u5e8f\u5217\u5316\u5141\u8bb8\u5bf9Java\u7c7b\u8fdb\u884c\u4e00\u4e9b\u6539\u52a8\u3002\u5176\u4e2d\u90a3\u4e9b\u4e0d\u4f1a\u5f71\u54cd\u53cd\u5e8f\u5217\u5316\u8fc7\u7a0b\u7684\u7c7b\u7684\u6539\u52a8\u6709\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>Adding new variables to the class<\/li>\n<li>Changing the variables from transient to non-transient, for serialization it\u2019s like having a new field.<\/li>\n<li>Changing the variable from static to non-static, for serialization it\u2019s like having a new field.<\/li>\n<\/ul>\n<p>\u4e3a\u4e86\u4f7f\u6240\u6709\u8fd9\u4e9b\u66f4\u6539\u751f\u6548\uff0cJava\u7c7b\u5e94\u8be5\u4e3a\u7c7b\u5b9a\u4e49serialVersionUID\u3002\u8ba9\u6211\u4eec\u7f16\u5199\u4e00\u4e2a\u4ec5\u7528\u4e8e\u53cd\u5e8f\u5217\u5316\u4e4b\u524d\u6d4b\u8bd5\u7c7b\u4e2d\u5df2\u5e8f\u5217\u5316\u6587\u4ef6\u7684\u6d4b\u8bd5\u7c7b\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization;\r\n\r\nimport java.io.IOException;\r\n\r\npublic class DeserializationTest {\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\tString fileName=\"employee.ser\";\r\n\t\tEmployee empNew = null;\r\n\t\t\r\n\t\ttry {\r\n\t\t\tempNew = (Employee) SerializationUtil.deserialize(fileName);\r\n\t\t} catch (ClassNotFoundException | IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\t\r\n\t\tSystem.out.println(\"empNew Object::\"+empNew);\r\n\t\t\r\n\t}\r\n}\r\n<\/code><\/pre>\n<p>\u73b0\u5728\u53d6\u6d88\u6ce8\u91caEmployee\u7c7b\u4e2d\u7684&#8221;password&#8221;\u53d8\u91cf\u4ee5\u53ca\u5176getter-setter\u65b9\u6cd5\u5e76\u8fd0\u884c\u5b83\u3002\u4f60\u4f1a\u5f97\u5230\u4ee5\u4e0b\u5f02\u5e38\uff1b<\/p>\n<pre class=\"post-pre\"><code>java.io.InvalidClassException: com.Olivia.serialization.Employee; local class incompatible: stream classdesc serialVersionUID = -6470090944414208496, local class serialVersionUID = -6234198221249432383\r\n\tat java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604)\r\n\tat java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)\r\n\tat java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)\r\n\tat java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)\r\n\tat java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)\r\n\tat java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)\r\n\tat com.Olivia.serialization.SerializationUtil.deserialize(SerializationUtil.java:22)\r\n\tat com.Olivia.serialization.DeserializationTest.main(DeserializationTest.java:13)\r\nempNew Object::null\r\n<\/code><\/pre>\n<p>\u539f\u56e0\u5f88\u660e\u786e\uff0c\u4ee5\u524d\u7684\u7c7b\u548c\u65b0\u7c7b\u7684serialVersionUID\u662f\u4e0d\u540c\u7684\u3002\u5b9e\u9645\u4e0a\uff0c\u5982\u679c\u7c7b\u6ca1\u6709\u5b9a\u4e49serialVersionUID\uff0c\u5b83\u4f1a\u88ab\u81ea\u52a8\u8ba1\u7b97\u5e76\u5206\u914d\u7ed9\u8be5\u7c7b\u3002Java\u4f7f\u7528\u7c7b\u53d8\u91cf\u3001\u65b9\u6cd5\u3001\u7c7b\u540d\u3001\u5305\u7b49\u6765\u751f\u6210\u8fd9\u4e2a\u552f\u4e00\u7684\u957f\u6570\u5b57\u3002\u5982\u679c\u4f60\u5728\u4f7f\u7528\u4efb\u4f55\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4f60\u5c06\u81ea\u52a8\u6536\u5230\u4e00\u4e2a\u8b66\u544a\uff1a\u201c\u53ef\u5e8f\u5217\u5316\u7684\u7c7bEmployee\u6ca1\u6709\u58f0\u660e\u4e00\u4e2a\u7c7b\u578b\u4e3along\u7684\u9759\u6001final serialVersionUID\u5b57\u6bb5\u201d\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528Java\u5de5\u5177\u201cserialver\u201d\u6765\u751f\u6210\u7c7b\u7684serialVersionUID\uff0c\u5bf9\u4e8eEmployee\u7c7b\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u8fd0\u884c\u5b83\u3002<\/p>\n<pre class=\"post-pre\"><code>SerializationExample\/bin$serialver -classpath . com.Olivia.serialization.Employee\r\n<\/code><\/pre>\n<p>\u8bf7\u6ce8\u610f\uff0c\u4e0d\u4e00\u5b9a\u8981\u4ece\u8be5\u7a0b\u5e8f\u672c\u8eab\u751f\u6210\u5e8f\u5217\u7248\u672c\uff0c\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9700\u8981\u6307\u5b9a\u8be5\u503c\u3002\u5b83\u53ea\u9700\u8981\u5728\u90a3\u91cc\uff0c\u4ee5\u8ba9\u53cd\u5e8f\u5217\u5316\u8fc7\u7a0b\u77e5\u9053\u65b0\u7c7b\u662f\u540c\u4e00\u7c7b\u7684\u65b0\u7248\u672c\uff0c\u5e76\u4e14\u5e94\u8be5\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\u5904\u7406\u3002\u4f8b\u5982\uff0c\u53d6\u6d88\u6ce8\u91caEmployee\u7c7b\u4e2d\u7684serialVersionUID\u5b57\u6bb5\uff0c\u5e76\u8fd0\u884cSerializationTest\u7a0b\u5e8f\u3002\u73b0\u5728\u53d6\u6d88\u6ce8\u91caEmployee\u7c7b\u4e2d\u7684password\u5b57\u6bb5\uff0c\u5e76\u8fd0\u884cDeserializationTest\u7a0b\u5e8f\uff0c\u60a8\u5c06\u770b\u5230\u5bf9\u8c61\u6d41\u6210\u529f\u53cd\u5e8f\u5217\u5316\uff0c\u56e0\u4e3aEmployee\u7c7b\u7684\u66f4\u6539\u4e0e\u5e8f\u5217\u5316\u8fc7\u7a0b\u517c\u5bb9\u3002<\/p>\n<h3>Java\u7684Externalizable\u63a5\u53e3<\/h3>\n<p>\u5982\u679c\u4f60\u6ce8\u610f\u5230Java\u7684\u5e8f\u5217\u5316\u8fc7\u7a0b\uff0c\u5b83\u662f\u81ea\u52a8\u5b8c\u6210\u7684\u3002\u6709\u65f6\u5019\uff0c\u6211\u4eec\u60f3\u8981\u9690\u85cf\u5bf9\u8c61\u6570\u636e\u4ee5\u4fdd\u6301\u5176\u5b8c\u6574\u6027\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0java.io.Externalizable\u63a5\u53e3\uff0c\u5e76\u63d0\u4f9bwriteExternal()\u548creadExternal()\u65b9\u6cd5\u7684\u5b9e\u73b0\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\uff0c\u4ee5\u7528\u4e8e\u5e8f\u5217\u5316\u8fc7\u7a0b\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.externalization;\r\n\r\nimport java.io.Externalizable;\r\nimport java.io.IOException;\r\nimport java.io.ObjectInput;\r\nimport java.io.ObjectOutput;\r\n\r\npublic class Person implements Externalizable{\r\n\r\n\tprivate int id;\r\n\tprivate String name;\r\n\tprivate String gender;\r\n\t\r\n\t@Override\r\n\tpublic void writeExternal(ObjectOutput out) throws IOException {\r\n\t\tout.writeInt(id);\r\n\t\tout.writeObject(name+\"xyz\");\r\n\t\tout.writeObject(\"abc\"+gender);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void readExternal(ObjectInput in) throws IOException,\r\n\t\t\tClassNotFoundException {\r\n\t\tid=in.readInt();\r\n\t\t\/\/read in the same order as written\r\n\t\tname=(String) in.readObject();\r\n\t\tif(!name.endsWith(\"xyz\")) throw new IOException(\"corrupted data\");\r\n\t\tname=name.substring(0, name.length()-3);\r\n\t\tgender=(String) in.readObject();\r\n\t\tif(!gender.startsWith(\"abc\")) throw new IOException(\"corrupted data\");\r\n\t\tgender=gender.substring(3);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString(){\r\n\t\treturn \"Person{id=\"+id+\",name=\"+name+\",gender=\"+gender+\"}\";\r\n\t}\r\n\tpublic int getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(int id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\r\n\tpublic String getGender() {\r\n\t\treturn gender;\r\n\t}\r\n\r\n\tpublic void setGender(String gender) {\r\n\t\tthis.gender = gender;\r\n\t}\r\n\r\n}\r\n<\/code><\/pre>\n<p>\u8bf7\u6ce8\u610f\uff0c\u5728\u5c06\u5176\u8f6c\u6362\u4e3a\u6d41\u4e4b\u524d\uff0c\u6211\u5df2\u7ecf\u6539\u53d8\u4e86\u5b57\u6bb5\u7684\u503c\uff0c\u7136\u540e\u5728\u8bfb\u53d6\u65f6\u5c06\u66f4\u6539\u8fd8\u539f\u3002\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u53ef\u4ee5\u4fdd\u6301\u67d0\u79cd\u5f62\u5f0f\u7684\u6570\u636e\u5b8c\u6574\u6027\u3002\u5982\u679c\u5728\u8bfb\u53d6\u6d41\u6570\u636e\u540e\u5b8c\u6574\u6027\u68c0\u67e5\u5931\u8d25\uff0c\u6211\u4eec\u53ef\u4ee5\u629b\u51fa\u5f02\u5e38\u3002\u8ba9\u6211\u4eec\u7f16\u5199\u4e00\u4e2a\u6d4b\u8bd5\u7a0b\u5e8f\u6765\u89c2\u5bdf\u5b83\u7684\u5de5\u4f5c\u60c5\u51b5\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.externalization;\r\n\r\nimport java.io.FileInputStream;\r\nimport java.io.FileOutputStream;\r\nimport java.io.IOException;\r\nimport java.io.ObjectInputStream;\r\nimport java.io.ObjectOutputStream;\r\n\r\npublic class ExternalizationTest {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t\r\n\t\tString fileName = \"person.ser\";\r\n\t\tPerson person = new Person();\r\n\t\tperson.setId(1);\r\n\t\tperson.setName(\"Pankaj\");\r\n\t\tperson.setGender(\"Male\");\r\n\t\t\r\n\t\ttry {\r\n\t\t\tFileOutputStream fos = new FileOutputStream(fileName);\r\n\t\t\tObjectOutputStream oos = new ObjectOutputStream(fos);\r\n\t\t    oos.writeObject(person);\r\n\t\t    oos.close();\r\n\t\t} catch (IOException e) {\r\n\t\t\t\/\/ TODO Auto-generated catch block\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\t\r\n\t\tFileInputStream fis;\r\n\t\ttry {\r\n\t\t\tfis = new FileInputStream(fileName);\r\n\t\t\tObjectInputStream ois = new ObjectInputStream(fis);\r\n\t\t    Person p = (Person)ois.readObject();\r\n\t\t    ois.close();\r\n\t\t    System.out.println(\"Person Object Read=\"+p);\r\n\t\t} catch (IOException | ClassNotFoundException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t    \r\n\t}\r\n}\r\n<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u8fd0\u884c\u4ee5\u4e0a\u7a0b\u5e8f\u65f6\uff0c\u6211\u4eec\u5f97\u5230\u4ee5\u4e0b\u8f93\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code>Person Object Read=Person{id=1,name=Pankaj,gender=Male}\r\n<\/code><\/pre>\n<p>\u90a3\u4e48\uff0c\u5728Java\u4e2d\uff0c\u54ea\u4e2a\u66f4\u9002\u5408\u7528\u4e8e\u5e8f\u5217\u5316\u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u6700\u597d\u4f7f\u7528Serializable\u63a5\u53e3\uff0c\u5f53\u6211\u4eec\u8bfb\u5b8c\u8fd9\u7bc7\u6587\u7ae0\u65f6\uff0c\u4f60\u5c31\u4f1a\u77e5\u9053\u4e3a\u4ec0\u4e48\u4e86\u3002<\/p>\n<h3>Java\u5e8f\u5217\u5316\u65b9\u6cd5<\/h3>\n<p>\u6211\u4eec\u5df2\u7ecf\u770b\u5230\uff0c\u5728Java\u4e2d\u5e8f\u5217\u5316\u662f\u81ea\u52a8\u5b8c\u6210\u7684\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5b9e\u73b0Serializable\u63a5\u53e3\u3002\u8fd9\u4e2a\u5b9e\u73b0\u5728ObjectInputStream\u548cObjectOutputStream\u7c7b\u4e2d\u5b58\u5728\u3002\u4f46\u662f\u5982\u679c\u6211\u4eec\u60f3\u8981\u6539\u53d8\u4fdd\u5b58\u6570\u636e\u7684\u65b9\u5f0f\uff0c\u4f8b\u5982\u5728\u5bf9\u8c61\u4e2d\u6709\u4e00\u4e9b\u654f\u611f\u4fe1\u606f\uff0c\u6211\u4eec\u60f3\u5728\u4fdd\u5b58\/\u68c0\u7d22\u4e4b\u524d\u5bf9\u5176\u8fdb\u884c\u52a0\u5bc6\/\u89e3\u5bc6\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5728\u7c7b\u4e2d\u6211\u4eec\u53ef\u4ee5\u63d0\u4f9b\u56db\u4e2a\u65b9\u6cd5\u6765\u6539\u53d8\u5e8f\u5217\u5316\u884c\u4e3a\u3002\u5982\u679c\u8fd9\u4e9b\u65b9\u6cd5\u5728\u7c7b\u4e2d\u5b58\u5728\uff0c\u5b83\u4eec\u5c06\u88ab\u7528\u4e8e\u5e8f\u5217\u5316\u76ee\u7684\u3002<\/p>\n<ol>\u5982\u679c\u5728\u7c7b\u4e2d\u5b58\u5728readObject(ObjectInputStream ois)\u65b9\u6cd5\uff0c\u5219ObjectInputStream\u7684readObject()\u65b9\u6cd5\u5c06\u4f7f\u7528\u8be5\u65b9\u6cd5\u4ece\u6d41\u4e2d\u8bfb\u53d6\u5bf9\u8c61\u3002<br \/>\n\u5982\u679c\u5728\u7c7b\u4e2d\u5b58\u5728writeObject(ObjectOutputStream oos)\u65b9\u6cd5\uff0c\u5219ObjectOutputStream\u7684writeObject()\u65b9\u6cd5\u5c06\u4f7f\u7528\u8be5\u65b9\u6cd5\u5c06\u5bf9\u8c61\u5199\u5165\u6d41\u4e2d\u3002\u5176\u4e2d\u4e00\u79cd\u5e38\u89c1\u7528\u6cd5\u662f\u5bf9\u5bf9\u8c61\u53d8\u91cf\u8fdb\u884c\u6e10\u53d8\uff0c\u4ee5\u4fdd\u6301\u6570\u636e\u5b8c\u6574\u6027\u3002<br \/>\n\u5982\u679c\u5b58\u5728Object writeReplace()\u65b9\u6cd5\uff0c\u5219\u5728\u5e8f\u5217\u5316\u8fc7\u7a0b\u4e4b\u540e\u5c06\u8c03\u7528\u6b64\u65b9\u6cd5\uff0c\u5e76\u5c06\u8fd4\u56de\u7684\u5bf9\u8c61\u5e8f\u5217\u5316\u5230\u6d41\u4e2d\u3002<br \/>\n\u5982\u679c\u5b58\u5728Object readResolve()\u65b9\u6cd5\uff0c\u5219\u5728\u53cd\u5e8f\u5217\u5316\u8fc7\u7a0b\u4e4b\u540e\u5c06\u8c03\u7528\u6b64\u65b9\u6cd5\uff0c\u5c06\u6700\u7ec8\u7684\u5bf9\u8c61\u8fd4\u56de\u7ed9\u8c03\u7528\u7a0b\u5e8f\u3002\u5176\u4e2d\u4e00\u79cd\u7528\u6cd5\u662f\u5728\u5e8f\u5217\u5316\u7c7b\u4e2d\u5b9e\u73b0Singleton\u6a21\u5f0f\u3002\u8be6\u7ec6\u4e86\u89e3\u5e8f\u5217\u5316\u548cSingleton\u6a21\u5f0f\uff0c\u8bf7\u9605\u8bfb\u66f4\u591a\u4fe1\u606f\u3002<\/ol>\n<p>\u901a\u5e38\u5728\u5b9e\u65bd\u4e0a\u8ff0\u65b9\u6cd5\u65f6\uff0c\u5b83\u4eec\u901a\u5e38\u88ab\u4fdd\u7559\u4e3a\u79c1\u6709\uff0c\u4ee5\u9632\u6b62\u5b50\u7c7b\u5bf9\u5176\u8fdb\u884c\u8986\u76d6\u3002\u5b83\u4eec\u4ec5\u7528\u4e8e\u5e8f\u5217\u5316\u76ee\u7684\uff0c\u4fdd\u6301\u79c1\u6709\u53ef\u907f\u514d\u4efb\u4f55\u5b89\u5168\u95ee\u9898\u3002<\/p>\n<h3>\u7ee7\u627f\u5b9e\u73b0\u7684\u5e8f\u5217\u5316<\/h3>\n<p>\u6709\u65f6\u6211\u4eec\u9700\u8981\u6269\u5c55\u4e00\u4e2a\u6ca1\u6709\u5b9e\u73b0Serializable\u63a5\u53e3\u7684\u7c7b\u3002\u5982\u679c\u6211\u4eec\u4f9d\u8d56\u4e8e\u81ea\u52a8\u5e8f\u5217\u5316\u7684\u884c\u4e3a\uff0c\u5e76\u4e14\u8d85\u7c7b\u6709\u4e00\u4e9b\u72b6\u6001\uff0c\u90a3\u4e48\u5b83\u4eec\u5c06\u4e0d\u4f1a\u8f6c\u6362\u4e3a\u6d41\uff0c\u5e76\u4e14\u540e\u7eed\u65e0\u6cd5\u68c0\u7d22\u3002\u8fd9\u662freadObject\uff08\uff09\u548cwriteObject\uff08\uff09\u65b9\u6cd5\u771f\u6b63\u6709\u4f5c\u7528\u7684\u5730\u65b9\u3002\u901a\u8fc7\u63d0\u4f9b\u5b83\u4eec\u7684\u5b9e\u73b0\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8d85\u7c7b\u7684\u72b6\u6001\u4fdd\u5b58\u5230\u6d41\u4e2d\uff0c\u7136\u540e\u5728\u4ee5\u540e\u68c0\u7d22\u5b83\u3002\u8ba9\u6211\u4eec\u770b\u770b\u8fd9\u4e2a\u5b9e\u4f8b\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization.inheritance;\r\n\r\npublic class SuperClass {\r\n\r\n\tprivate int id;\r\n\tprivate String value;\r\n\t\r\n\tpublic int getId() {\r\n\t\treturn id;\r\n\t}\r\n\tpublic void setId(int id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\tpublic String getValue() {\r\n\t\treturn value;\r\n\t}\r\n\tpublic void setValue(String value) {\r\n\t\tthis.value = value;\r\n\t}\t\r\n}\r\n<\/code><\/pre>\n<p>SuperClass\u662f\u4e00\u4e2a\u7b80\u5355\u7684Java bean\uff0c\u4f46\u5b83\u6ca1\u6709\u5b9e\u73b0Serializable\u63a5\u53e3\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization.inheritance;\r\n\r\nimport java.io.IOException;\r\nimport java.io.InvalidObjectException;\r\nimport java.io.ObjectInputStream;\r\nimport java.io.ObjectInputValidation;\r\nimport java.io.ObjectOutputStream;\r\nimport java.io.Serializable;\r\n\r\npublic class SubClass extends SuperClass implements Serializable, ObjectInputValidation{\r\n\r\n\tprivate static final long serialVersionUID = -1322322139926390329L;\r\n\r\n\tprivate String name;\r\n\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String toString(){\r\n\t\treturn \"SubClass{id=\"+getId()+\",value=\"+getValue()+\",name=\"+getName()+\"}\";\r\n\t}\r\n\t\r\n\t\/\/adding helper method for serialization to save\/initialize super class state\r\n\tprivate void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException{\r\n\t\tois.defaultReadObject();\r\n\t\t\r\n\t\t\/\/notice the order of read and write should be same\r\n\t\tsetId(ois.readInt());\r\n\t\tsetValue((String) ois.readObject());\t\r\n\t}\r\n\t\r\n\tprivate void writeObject(ObjectOutputStream oos) throws IOException{\r\n\t\toos.defaultWriteObject();\r\n\t\t\r\n\t\toos.writeInt(getId());\r\n\t\toos.writeObject(getValue());\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void validateObject() throws InvalidObjectException {\r\n\t\t\/\/validate the object here\r\n\t\tif(name == null || \"\".equals(name)) throw new InvalidObjectException(\"name can't be null or empty\");\r\n\t\tif(getId() &lt;=0) throw new InvalidObjectException(\"ID can't be negative or zero\");\r\n\t}\t\r\n}\r\n<\/code><\/pre>\n<p>\u6ce8\u610f\u5199\u5165\u548c\u8bfb\u53d6\u6d41\u7684\u989d\u5916\u6570\u636e\u7684\u987a\u5e8f\u5e94\u8be5\u76f8\u540c\u3002\u6211\u4eec\u53ef\u4ee5\u5728\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e\u65f6\u52a0\u5165\u4e00\u4e9b\u903b\u8f91\u4ee5\u4fdd\u8bc1\u5b89\u5168\u6027\u3002\u8fd8\u8981\u6ce8\u610f\u8be5\u7c7b\u5b9e\u73b0\u4e86ObjectInputValidation\u63a5\u53e3\u3002\u901a\u8fc7\u5b9e\u73b0validateObject()\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u6dfb\u52a0\u4e00\u4e9b\u4e1a\u52a1\u9a8c\u8bc1\u4ee5\u786e\u4fdd\u6570\u636e\u5b8c\u6574\u6027\u4e0d\u53d7\u635f\u3002\u8ba9\u6211\u4eec\u7f16\u5199\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff0c\u770b\u770b\u662f\u5426\u53ef\u4ee5\u4ece\u5e8f\u5217\u5316\u7684\u6570\u636e\u4e2d\u68c0\u7d22\u8d85\u7c7b\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization.inheritance;\r\n\r\nimport java.io.IOException;\r\n\r\nimport com.Olivia.serialization.SerializationUtil;\r\n\r\npublic class InheritanceSerializationTest {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tString fileName = \"subclass.ser\";\r\n\t\t\r\n\t\tSubClass subClass = new SubClass();\r\n\t\tsubClass.setId(10);\r\n\t\tsubClass.setValue(\"Data\");\r\n\t\tsubClass.setName(\"Pankaj\");\r\n\t\t\r\n\t\ttry {\r\n\t\t\tSerializationUtil.serialize(subClass, fileName);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\ttry {\r\n\t\t\tSubClass subNew = (SubClass) SerializationUtil.deserialize(fileName);\r\n\t\t\tSystem.out.println(\"SubClass read = \"+subNew);\r\n\t\t} catch (ClassNotFoundException | IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n}\r\n<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u8fd0\u884c\u4e0a\u8ff0\u7684\u7c7b\u65f6\uff0c\u6211\u4eec\u5f97\u5230\u4ee5\u4e0b\u7684\u8f93\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code>SubClass read = SubClass{id=10,value=Data,name=Pankaj}\r\n<\/code><\/pre>\n<p>\u6240\u4ee5\u8fd9\u6837\uff0c\u5373\u4f7f\u8d85\u7c7b\u4e0d\u5b9e\u73b0Serializable\u63a5\u53e3\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5e8f\u5217\u5316\u8d85\u7c7b\u7684\u72b6\u6001\u3002\u5f53\u8d85\u7c7b\u662f\u6211\u4eec\u65e0\u6cd5\u66f4\u6539\u7684\u7b2c\u4e09\u65b9\u7c7b\u65f6\uff0c\u8fd9\u79cd\u7b56\u7565\u975e\u5e38\u65b9\u4fbf\u3002<\/p>\n<h3>\u5e8f\u5217\u5316\u4ee3\u7406\u6a21\u5f0f<\/h3>\n<p>\u5728Java\u4e2d\uff0c\u5e8f\u5217\u5316\u5b58\u5728\u4e00\u4e9b\u4e25\u91cd\u7684\u9677\u9631\uff0c\u6bd4\u5982\uff1b<\/p>\n<ul class=\"post-ul\">\n<li>The class structure can\u2019t be changed a lot without breaking the java serialization process. So even though we don\u2019t need some variables later on, we need to keep them just for backward compatibility.<\/li>\n<li>Serialization causes huge security risks, an attacker can change the stream sequence and cause harm to the system. For example, user role is serialized and an attacker change the stream value to make it admin and run malicious code.<\/li>\n<\/ul>\n<p>Java\u5e8f\u5217\u5316\u4ee3\u7406\u6a21\u5f0f\u662f\u4e00\u79cd\u901a\u8fc7\u5e8f\u5217\u5316\u5b9e\u73b0\u66f4\u9ad8\u5b89\u5168\u6027\u7684\u65b9\u6cd5\u3002\u5728\u8fd9\u79cd\u6a21\u5f0f\u4e2d\uff0c\u4e00\u4e2a\u5185\u90e8\u79c1\u6709\u9759\u6001\u7c7b\u88ab\u7528\u4f5c\u5e8f\u5217\u5316\u76ee\u7684\u7684\u4ee3\u7406\u7c7b\u3002\u8be5\u7c7b\u7684\u8bbe\u8ba1\u65b9\u5f0f\u662f\u4e3a\u4e86\u7ef4\u62a4\u4e3b\u7c7b\u7684\u72b6\u6001\u3002\u901a\u8fc7\u6b63\u786e\u5b9e\u73b0readResolve()\u548cwriteReplace()\u65b9\u6cd5\u6765\u5b9e\u73b0\u8be5\u6a21\u5f0f\u3002\u8ba9\u6211\u4eec\u9996\u5148\u7f16\u5199\u4e00\u4e2a\u5b9e\u73b0\u5e8f\u5217\u5316\u4ee3\u7406\u6a21\u5f0f\u7684\u7c7b\uff0c\u7136\u540e\u6211\u4eec\u5c06\u5bf9\u5176\u8fdb\u884c\u5206\u6790\u4ee5\u4fbf\u66f4\u597d\u5730\u7406\u89e3\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization.proxy;\r\n\r\nimport java.io.InvalidObjectException;\r\nimport java.io.ObjectInputStream;\r\nimport java.io.Serializable;\r\n\r\npublic class Data implements Serializable{\r\n\r\n\tprivate static final long serialVersionUID = 2087368867376448459L;\r\n\r\n\tprivate String data;\r\n\t\r\n\tpublic Data(String d){\r\n\t\tthis.data=d;\r\n\t}\r\n\r\n\tpublic String getData() {\r\n\t\treturn data;\r\n\t}\r\n\r\n\tpublic void setData(String data) {\r\n\t\tthis.data = data;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String toString(){\r\n\t\treturn \"Data{data=\"+data+\"}\";\r\n\t}\r\n\t\r\n\t\/\/serialization proxy class\r\n\tprivate static class DataProxy implements Serializable{\r\n\t\r\n\t\tprivate static final long serialVersionUID = 8333905273185436744L;\r\n\t\t\r\n\t\tprivate String dataProxy;\r\n\t\tprivate static final String PREFIX = \"ABC\";\r\n\t\tprivate static final String SUFFIX = \"DEFG\";\r\n\t\t\r\n\t\tpublic DataProxy(Data d){\r\n\t\t\t\/\/obscuring data for security\r\n\t\t\tthis.dataProxy = PREFIX + d.data + SUFFIX;\r\n\t\t}\r\n\t\t\r\n\t\tprivate Object readResolve() throws InvalidObjectException {\r\n\t\t\tif(dataProxy.startsWith(PREFIX) &amp;&amp; dataProxy.endsWith(SUFFIX)){\r\n\t\t\treturn new Data(dataProxy.substring(3, dataProxy.length() -4));\r\n\t\t\t}else throw new InvalidObjectException(\"data corrupted\");\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n\t\/\/replacing serialized object to DataProxy object\r\n\tprivate Object writeReplace(){\r\n\t\treturn new DataProxy(this);\r\n\t}\r\n\t\r\n\tprivate void readObject(ObjectInputStream ois) throws InvalidObjectException{\r\n\t\tthrow new InvalidObjectException(\"Proxy is not used, something fishy\");\r\n\t}\r\n}\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li>Both Data and DataProxy class should implement Serializable interface.<\/li>\n<li>DataProxy should be able to maintain the state of Data object.<\/li>\n<li>DataProxy is inner private static class, so that other classes can\u2019t access it.<\/li>\n<li>DataProxy should have a single constructor that takes Data as argument.<\/li>\n<li>Data class should provide writeReplace() method returning DataProxy instance. So when Data object is serialized, the returned stream is of DataProxy class. However DataProxy class is not visible outside, so it can\u2019t be used directly.<\/li>\n<li>DataProxy class should implement readResolve() method returning Data object. So when Data class is deserialized, internally DataProxy is deserialized and when it\u2019s readResolve() method is called, we get Data object.<\/li>\n<li>Finally implement readObject() method in Data class and throw InvalidObjectException to avoid hackers attack trying to fabricate Data object stream and parse it.<\/li>\n<\/ul>\n<p>\u6211\u4eec\u6765\u5199\u4e00\u4e2a\u5c0f\u6d4b\u8bd5\u6765\u68c0\u67e5\u5b9e\u73b0\u662f\u5426\u6b63\u5e38\u5de5\u4f5c\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.serialization.proxy;\r\n\r\nimport java.io.IOException;\r\n\r\nimport com.Olivia.serialization.SerializationUtil;\r\n\r\npublic class SerializationProxyTest {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tString fileName = \"data.ser\";\r\n\t\t\r\n\t\tData data = new Data(\"Pankaj\");\r\n\t\t\r\n\t\ttry {\r\n\t\t\tSerializationUtil.serialize(data, fileName);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\t\r\n\t\ttry {\r\n\t\t\tData newData = (Data) SerializationUtil.deserialize(fileName);\r\n\t\t\tSystem.out.println(newData);\r\n\t\t} catch (ClassNotFoundException | IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u8fd0\u884c\u4e0a\u8ff0\u7c7b\u65f6\uff0c\u5728\u63a7\u5236\u53f0\u4e2d\u5f97\u5230\u4ee5\u4e0b\u8f93\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code>Data{data=Pankaj}\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4f60\u6253\u5f00data.ser\u6587\u4ef6\uff0c\u4f60\u4f1a\u770b\u5230DataProxy\u5bf9\u8c61\u88ab\u4fdd\u5b58\u4e3a\u6d41\u5728\u6587\u4ef6\u4e2d\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5728Java\u4e2d\uff0c\u5e8f\u5217\u5316\u662f\u5728JDK 1.1\u4e2d\u5f15\u5165\u7684\uff0c\u5b83\u662f\u6838\u5fc3Java\u7684\u91cd\u8981\u529f\u80fd\u4e4b\u4e00\u3002 Java\u4e2d\u7684\u5e8f\u5217\u5316 \u5728Jav [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-50732","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java\u4e2d\u7684\u5e8f\u5217\u5316 - Java\u5e8f\u5217\u5316 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/java\u4e2d\u7684\u5e8f\u5217\u5316-java\u5e8f\u5217\u5316\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java\u4e2d\u7684\u5e8f\u5217\u5316 - Java\u5e8f\u5217\u5316\" \/>\n<meta property=\"og:description\" content=\"\u5728Java\u4e2d\uff0c\u5e8f\u5217\u5316\u662f\u5728JDK 1.1\u4e2d\u5f15\u5165\u7684\uff0c\u5b83\u662f\u6838\u5fc3Java\u7684\u91cd\u8981\u529f\u80fd\u4e4b\u4e00\u3002 Java\u4e2d\u7684\u5e8f\u5217\u5316 \u5728Jav [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/java\u4e2d\u7684\u5e8f\u5217\u5316-java\u5e8f\u5217\u5316\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-23T02:31:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-23T07:31:29+00:00\" \/>\n<meta name=\"author\" content=\"\u97f5, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u97f5, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/\",\"name\":\"Java\u4e2d\u7684\u5e8f\u5217\u5316 - Java\u5e8f\u5217\u5316 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-12-23T02:31:39+00:00\",\"dateModified\":\"2023-12-23T07:31:29+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\u4e2d\u7684\u5e8f\u5217\u5316 &#8211; Java\u5e8f\u5217\u5316\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\",\"name\":\"\u97f5, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"caption\":\"\u97f5, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java\u4e2d\u7684\u5e8f\u5217\u5316 - Java\u5e8f\u5217\u5316 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/java\u4e2d\u7684\u5e8f\u5217\u5316-java\u5e8f\u5217\u5316\/","og_locale":"zh_CN","og_type":"article","og_title":"Java\u4e2d\u7684\u5e8f\u5217\u5316 - Java\u5e8f\u5217\u5316","og_description":"\u5728Java\u4e2d\uff0c\u5e8f\u5217\u5316\u662f\u5728JDK 1.1\u4e2d\u5f15\u5165\u7684\uff0c\u5b83\u662f\u6838\u5fc3Java\u7684\u91cd\u8981\u529f\u80fd\u4e4b\u4e00\u3002 Java\u4e2d\u7684\u5e8f\u5217\u5316 \u5728Jav [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/java\u4e2d\u7684\u5e8f\u5217\u5316-java\u5e8f\u5217\u5316\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-12-23T02:31:39+00:00","article_modified_time":"2023-12-23T07:31:29+00:00","author":"\u97f5, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u97f5, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"2 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/","name":"Java\u4e2d\u7684\u5e8f\u5217\u5316 - Java\u5e8f\u5217\u5316 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-12-23T02:31:39+00:00","dateModified":"2023-12-23T07:31:29+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Java\u4e2d\u7684\u5e8f\u5217\u5316 &#8211; Java\u5e8f\u5217\u5316"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e","name":"\u97f5, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","caption":"\u97f5, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/java%e4%b8%ad%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96-java%e5%ba%8f%e5%88%97%e5%8c%96\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50732","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=50732"}],"version-history":[{"count":1,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50732\/revisions"}],"predecessor-version":[{"id":50799,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50732\/revisions\/50799"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=50732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=50732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=50732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}