我有一个使用RMI的远程端口传输。但是我不确定那些线程安全的对象是否可以序列化。以前有人试过吗?
更新 斯卡弗曼说是,但我没有连载。
这是我传送的课程。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package net.shisoft.beans;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author Shisoft
*/
public class WhatzNewList {
ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>> WhatzNewTable = new ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>>();
String user;
public ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>> getWhatzNewTable() {
return WhatzNewTable;
}
public void setWhatzNewTable(ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>> WhatzNewTable) {
this.WhatzNewTable = WhatzNewTable;
}
public String getUser() {
return user;
}
public void setUser(String usere) {
this.user = usere;
}
public WhatzNewList(String user) {
this.user = user;
}
}
这是班级WhatzNewEntry
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package net.shisoft.beans;
import java.util.Date;
/**
*
* @author Shisoft
*/
public class WhatzNewEntry {
String Title;
String context;
String contact;
Date Time;
public Date getTime() {
return Time;
}
public void setTime(Date Time) {
this.Time = Time;
}
public String getTitle() {
return Title;
}
public void setTitle(String Title) {
this.Title = Title;
}
public String getContact() {
return contact;
}
public void setContact(String contact) {
this.contact = contact;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
可能是斯卡弗是对的,但这里有什么不对?
答案 0 :(得分:5)
他们都实施java.io.Serializable
。所以,是的,它们可以被序列化。
当然,他们的内容是否可以序列化是一个完全不同的问题。
答案 1 :(得分:5)
ConcurrentHashMaps(CHM)是无法有效序列化的重量级对象。例如。为什么要序列化所有锁定信息?
转换为HashMap,Map,Set甚至toString()等中间对象效率更高。
当然最有效的是根本不使用默认的Serializable行为,而是编写自己的Externalizable接口,它可以完全控制缓冲区内容。
EG。 - 这是一个序列化的空CHM:
¬ísr&amp; java.util.concurrent.ConcurrentHashMapd™Þ‡)= I segmentMaskI segmentShift [segmentst 1 [Ljava / util / concurrent / ConcurrentHashMap $ Segment; xp ur 1 [Ljava.util.concurrent.ConcurrentHashMap $ Segment ; Rw?A2> 9t xp sr .java.util.concurrent.ConcurrentHashMap $ Segment6LX“)= F loadFactorxr(java.util.concurrent.locks.ReentrantLockfU¨,,ÈjëLsynct / Ljava / util / concurrent / locks / ReentrantLock $ Sync; xpsr 4java.util.concurrent.locks.ReentrantLock $NonfairSynce2çS{¿xr -java.util。 concurrent.locks.ReentrantLock $Sync¸¢“ªDZ| xr5java.util.concurrent.locks.AbstractQueuedSynchronizerfU¨Cu?RãIstatexr6java.util.concurrent.locks.AbstractOwnableSynchronizer3߯¹mo©xp?@ sq~sq〜?@ sq ~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq〜?@ sq~sq~?@ sq~sq 〜?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ ppx
毛。这是从toString()序列化的相同CHM:
’t{}
通过一些转换工作,您可以节省大量带宽!
答案 2 :(得分:0)
有趣的是,如果我在UnitTest Test类中使用序列化,并且我尝试序列化类(完全可序列化)但以这种方式包含CopyOnWriteArrayList:
public class SerializeTest {
@Test
public void Test() {
// serializeanyserializable class
}
抛出异常:
java.io.NotSerializableException:SerializeTest ... 在java.util.concurrent.CopyOnWriteArrayList.writeObject(CopyOnWriteArrayList.java:857)
调试时,我看到了什么: CopyOnWriteArrayList使用从SerializeTest派生的临时对象,如SerializeTest $ 1.
所以,唯一的解决方案是我必须使Test可序列化,然后它突然开始工作。
有没有人有解释?