2

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

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

}

可能 skaffman 是对的,但这里有什么问题?

4

3 回答 3

5

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

转换为 HashMap、Map、Set 甚至 toString() 之类的中间对象效率要高得多。

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

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

¬í sr &java.util.concurrent.ConcurrentHashMapd™Þ‡)= I segmentMaskI segmentShift[ segmentt 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ë L synct /Ljava/util/concurrent/locks/ReentrantLock$Sync;xpsr 4java。 util.concurrent.locks.ReentrantLock$NonfairSynce^2çS{¿ xr -java.util.concurrent.locks.ReentrantLock$Sync¸¢”ªDZ| xr 5java.util.concurrent.locks.AbstractQueuedSynchronizerfU¨Cu?Rã I statexr 6java.util.concurrent .锁。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 {}

通过做一些转换工作,您可以获得巨大的带宽节省!

于 2011-05-23T23:57:34.050 回答
5

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

当然,它们的内容是否可以连载完全是另一个问题。

于 2011-02-01T19:38:28.500 回答
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 可序列化,然后它突然开始工作。

有人有解释吗?

于 2015-07-06T22:15:58.387 回答