package openmods.serializable.providers; import com.google.common.collect.Sets; import com.google.common.reflect.TypeToken; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.lang.reflect.Type; import java.util.Set; import openmods.reflection.TypeUtils; import openmods.serializable.IGenericSerializerProvider; import openmods.utils.io.IStreamSerializer; public class SetSerializerProvider implements IGenericSerializerProvider { @Override public IStreamSerializer<?> getSerializer(Type type) { TypeToken<?> typeToken = TypeToken.of(type); if (TypeUtils.SET_TOKEN.isAssignableFrom(typeToken)) { final TypeToken<?> componentType = typeToken.resolveType(TypeUtils.SET_VALUE_PARAM); return createSetSerializer(componentType); } return null; } protected IStreamSerializer<?> createSetSerializer(final TypeToken<?> componentType) { final IStreamSerializer<Object[]> arraySerializer = NullableCollectionSerializer.createObjectArraySerializer(componentType); return new IStreamSerializer<Set<?>>() { @Override public Set<?> readFromStream(DataInput input) throws IOException { Object[] values = arraySerializer.readFromStream(input); return Sets.newHashSet(values); } @Override public void writeToStream(Set<?> o, DataOutput output) throws IOException { final Object[] tmp = new Object[o.size()]; arraySerializer.writeToStream(o.toArray(tmp), output); } }; } }