2013-02-18 33 views
1

我使用objectPlanet的第三方工具稱爲easyChart來生成圖形圖表。他們提供了一種稱爲Chart.jar和ChartServer.jar使用不同JVM版本的java序列號

我寫在服務器端的easyChart對象一個jar lib目錄下:

Chart chart = new BarChart(); 
... <create chart data here> ... 
ByteArrayOutputStream bStream = new ByteArrayOutputStream(); 
ObjectOutputStream oStream = new ObjectOutputStream(bStream); 
oStream.writeObject (chart); 
byte[] byteVal = bStream.toByteArray(); 
String chartInString = Base64.encode(byteVal); 

和讀回在客戶端:

byte[] readByte = Base64.decode(chartInString); 
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(readByte)); 
Chart chart = (Chart) ois.readObject(); 

它的工作原理很好,當服務器和客戶端具有相同的JVM版本。我意識到GenericChart實現序列化(這個類在提供的jar中)。

我怎麼能克服這個問題,因爲我不能修改他們提供的jar類?

非常感謝任何答覆。 謝謝!

+0

您遇到過哪些問題? – Henry 2013-02-18 09:37:06

+0

可以說:寫圖表對象時服務器使用Java 6更新27。我使用2個客戶端機器:第一次使用Java 6更新27,我可以讀取Chart對象,第二次使用Java 7,我無法讀取Chart對象,它引發此異常:java.io.InvalidClassException:javax.swing.JComponent ;本地類不兼容:stream classdesc serialVersionUID = -1030230214076481435,本地類serialVersionUID = 5670834184508236790 – baizen 2013-02-18 09:39:39

回答

1

我無法讀取Chart對象,它引發此異常:java.io.InvalidClassException:javax.swing.JComponent;局部類不兼容:流classdesc的serialVersionUID = -1030230214076481435,本地類的serialVersionUID = 5670834184508236790

其實,這是不相關的JVM版本,但在運行時庫。類別javax.swing.JComponent以使串行表示不兼容的方式進行了更改。

恐怕,除了使用相同的版本之外,沒有什麼可以做的。

+0

+1 - 另一方面是,如果您需要持久性在多個JVM版本上工作,則最好使用不同的機制;例如JSON或XML序列化或數據庫。 – 2013-02-18 09:59:05

+0

或者序列化模型而不是Swing組件本身。 – EJP 2013-02-18 12:30:54

1

存在每個Swing類的類Javadoc中的警告,說明序列化版本不會與其他JDK版本兼容。所以,不要序列化它們。序列化模型。

+1

如何序列化模型? – 2014-06-23 11:21:53