Не могу получить валидность количества полей до и после сериализации.
Пробовал несколько вариантов в методе ReadObject, в том числе и напрямую писать в map.
Натолкните на мысль, пожалуйста, где я просчитался.
package com.javarush.task.task37.task3707;
import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
public class AmigoSet<E> extends AbstractSet implements Serializable, Cloneable, Set {
private static final Object PRESENT = new Object();
private transient HashMap<E, Object> map;
public AmigoSet(Collection<? extends E> collection) {
int capacity = 0;
capacity = Math.max((int) Math.ceil((double) (collection.size()/.75f)), 16);
map = new HashMap<>(capacity);
for (E e: collection){
map.put(e, PRESENT);
}
}
public AmigoSet() {
map = new HashMap<>();
}
@Override
public Object clone() {
AmigoSet<E> result = null;
try
{
result = (AmigoSet<E>) super.clone();
result.map = (HashMap<E, Object>) this.map.clone();
}
catch (Exception e) {
throw new InternalError();
}
return result;
}
@Override
public boolean add(Object o) {
;
return map.put((E) o, PRESENT) == null;
}
@Override
public Iterator<E> iterator()
{
Set<E> keys = map.keySet();
return keys.iterator();
}
@Override
public void forEach(Consumer action) {
}
@Override
public boolean removeIf(Predicate filter) {
return false;
}
@Override
public Spliterator spliterator() {
return null;
}
@Override
public Stream stream() {
return null;
}
@Override
public Stream parallelStream() {
return null;
}
@Override
public int size() {
return map.size();
}
public void clear() {
map.clear();
}
public boolean isEmpty() {
return map.isEmpty();
}
public boolean remove(Object o) {
map.remove(o);
return false;
}
@Override
public boolean contains(Object o) {
return map.get(o) != null;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeInt(HashMapReflectionHelper.<Integer>callHiddenMethod(map, "capacity"));
out.writeFloat(HashMapReflectionHelper.<Float>callHiddenMethod(map, "loadFactor"));
for (E o : map.keySet()) {
out.writeObject(o);
}
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
int capacity = in.readInt();
float loadFactor = in.readFloat();
map = new HashMap<>(capacity, loadFactor);
while (in.available() > 0) {
add(in.readObject());
}
/*for (int i=0; i<capacity; i++) {
add(in.readObject());
}*/
}
}