2

RMIを使用してクラステレポートを実行していますが、これらのスレッドセーフオブジェクトをシリアル化できるかどうかわかりません。以前に試したことはありますか?

UPDATE 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

どちらも実装していjava.io.Serializableます。そうです、それらはシリアル化できます。

もちろん、それらのコンテンツをシリアル化できるかどうかは、まったく別の問題です。

于 2011-02-01T19:38:28.500 に答える
5

ConcurrentHashMaps(CHM)は、効率的にシリアル化されていないヘビーウェイトオブジェクトです。例えば。なぜすべてのロック情報をシリアル化したいのですか?

HashMap、Map、Set、さらにはtoString()などの中間オブジェクトへの変換ははるかに効率的です。

もちろん、最も効率的なのは、デフォルトのSerializable動作をまったく使用せず、バッファの内容を完全に制御できる独自のExternalizableインターフェイスを作成することです。

例えば。-シリアル化された空のCHMは次のとおりです。

¬ísr&java.util.concurrent.ConcurrentHashMapd™Þ‡)= I segmentMaskI segmentShift [segmentst 1 [Ljava / util / current / 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;xpsr4java。 util.concurrent.locks.ReentrantLock $ NonfairSynceˆ2ç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{}

少しの変換作業を行うことで、帯域幅を大幅に節約できます。

于 2011-05-23T23:57:34.050 に答える
0

面白いのは、UnitTest Testクラス内でシリアル化を使用し、クラス(完全にシリアル化可能)をシリアル化しようとしたが、CopyOnWriteArrayListが次のように含まれている場合です。

public class SerializeTest {
@Test
public void Test() {
// serializeanyserializable class
}

例外をスローします:

java.io.NotSerializableException:SerializeTest ... at java.util.concurrent.CopyOnWriteArrayList.writeObject(CopyOnWriteArrayList.java:857)

そして、デバッグするとき、私が見るもの:CopyOnWriteArrayListは、SerializeTest$1のようなSerializeTestから派生した一時オブジェクトを使用します。

したがって、唯一の解決策は、テストをシリアル化可能にする必要があることです。そうすると、突然機能し始めます。

誰か説明がありますか?

于 2015-07-06T22:15:58.387 に答える