Можно ли сериализовать «CopyOnWriteArrayList» и «ConcurrentHashMap»? - PullRequest
2 голосов
/ 01 февраля 2011

У меня есть класс телепортации с использованием 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 ]

5 голосов
/ 24 мая 2011

ConcurrentHashMaps (CHM) - это тяжеловесные объекты, которые неэффективно сериализуются.Например.Почему вы хотите сериализовать всю информацию о блокировке?

Преобразование в промежуточный объект, такой как HashMap, Map, Set или даже toString (), намного эффективнее.

Конечно, наиболее эффективным являетсявообще не использовать поведение Serializable по умолчанию, а написать собственный интерфейс Externalizable, который дает вам полный контроль над содержимым буфера.

Например.- вот сериализованный пустой CHM:

¬í sr & java.util.concurrent.ConcurrentHashMapd ™ Þ ‡) = I сегментMaskI сегментShift [сегменты 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.ReentrantLockjU¨ ,,/ util / concurrent / locks / ReentrantLock $ Sync; xpsr 4java.util.concurrent.locks.ReentrantLock $ NonfairSynceˆ2çS {¿xr -java.util.concurrent.locks.ReentrantLock $ Sync¸ ¢ ”ªDZ | xr 5jur.locks.AbstractQueuedSynchronizerfU¨Cu? Rã I statexr 6java.util.concurrent.locks.Bbsq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ sq ~ sq ~? @ ppx

Gross. Вот тот же CHM, сериализованный из toString ():

’ t {}

Выполнив небольшую работу по преобразованию, вы получите огромную экономию пропускной способности!

5 голосов
/ 01 февраля 2011

Они оба реализуют java.io.Serializable. Так что да, они могут быть сериализованы.

Можно ли сериализовать их содержимое , конечно, совсем другой вопрос.

0 голосов
/ 07 июля 2015

Что смешно, так это то, что если я использую сериализацию в своем классе 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, и тогда он вдруг начинает работать.

У кого-нибудь есть объяснение?

...