“CopyOnWriteArrayList”和“ConcurrentHashMap”可以序列化吗?

时间:2011-02-01 19:24:29

标签: java serialization thread-safety rmi concurrenthashmap

我有一个使用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;
    }

}
可能是斯卡弗是对的,但这里有什么不对?

3 个答案:

答案 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可序列化,然后它突然开始工作。

有没有人有解释?