"CopyOnWriteArrayList"和"ConcurrentHashMap"可以序列化吗?

Shi*_*oft 2 java serialization rmi thread-safety concurrenthashmap

我有一个使用RMI的类传送.但我不确定那些线程安全的对象是否可以序列化.以前有人试过吗?

更新 skaffman说是的,但我没有序列化.

这是我传送的课程.

/*
 * 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是班级 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

ska*_*man 5

他们都实施java.io.Serializable.所以是的,它们可以被序列化.

当然,它们的内容是否可以序列化是一个完全不同的问题.


小智 5

ConcurrentHashMaps(CHM)是无法有效序列化的重量级对象.例如.为什么要序列化所有锁定信息?

转换为HashMap,Map,Set甚至toString()等中间对象要高效得多.

最有效的当然是根本不使用默认的Serializable行为,而是编写自己的Externalizable接口,它可以完全控制缓冲区内容.

例如. - 这是一个序列化的空CHM:

¬ísr&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~square~ ?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq~?@ sq~sq〜?@ PPX

毛.这是从toString()序列化的相同CHM:

’t{}

通过一些转换工作,您可以节省大量带宽!