class ListMarshaller<T>
        implements BytesReader<List<T>>, BytesWriter<List<T>>, StatefulCopyable<ListMarshaller<T>> {

    // Config fields
    private BytesReader<T> elementReader;
    private BytesWriter<? super T> elementWriter;

    /**
     * Constructs a {@code ListMarshaller} with the given list elements' serializers.
     * <p>
     * Use static factory {@link #of(BytesReader, BytesWriter)} instead of this constructor
     * directly.
     *
     * @param elementReader list elements' reader
     * @param elementWriter list elements' writer
     */
    public ListMarshaller(BytesReader<T> elementReader, BytesWriter<? super T> elementWriter) {
        this.elementReader = elementReader;
        this.elementWriter = elementWriter;
    }

    /**
     * Returns a {@code ListMarshaller} which uses the given list elements' serializers.
     *
     * @param elementReader list elements' reader
     * @param elementWriter list elements' writer
     * @param <T>           type of list elements
     * @return a {@code ListMarshaller} which uses the given list elements' serializers
     */
    public static <T> ListMarshaller<T> of(
            BytesReader<T> elementReader, BytesWriter<? super T> elementWriter) {
        return new ListMarshaller<>(elementReader, elementWriter);
    }

    /**
     * Returns a {@code ListMarshaller} which uses the given marshaller as both reader and writer of
     * list elements. Example: <pre><code>
     * ChronicleMap
     *     .of(String.class,{@code (Class<List<Integer>>)} ((Class) List.class))
     *     .valueMarshaller(ListMarshaller.of(IntegerMarshaller.INSTANCE))
     *     ...</code></pre>
     *
     * @param elementMarshaller list elements' marshaller
     * @param <T>               type of list elements
     * @param <M>               type of list elements' marshaller
     * @return a {@code ListMarshaller} which uses the given list elements' marshaller
     */
    public static <T, M extends BytesReader<T> & BytesWriter<? super T>> ListMarshaller<T> of(
            M elementMarshaller) {
        return of(elementMarshaller, elementMarshaller);
    }

    @NotNull
    @Override
    public List<T> read(Bytes in, @Nullable List<T> using) {<FILL_FUNCTION_BODY>}

    @Override
    public void write(Bytes out, @NotNull List<T> toWrite) {
        out.writeInt(toWrite.size());
        // indexed loop to avoid garbage creation
        //noinspection ForLoopReplaceableByForEach
        for (int i = 0; i < toWrite.size(); i++) {
            elementWriter.write(out, toWrite.get(i));
        }
    }

    @Override
    public ListMarshaller<T> copy() {
        if (elementReader instanceof StatefulCopyable ||
                elementWriter instanceof StatefulCopyable) {
            return new ListMarshaller<>(copyIfNeeded(elementReader), copyIfNeeded(elementWriter));
        } else {
            return this;
        }
    }

    @Override
    public void readMarshallable(@NotNull WireIn wireIn) {
        elementReader = wireIn.read(() -> "elementReader").typedMarshallable();
        elementWriter = wireIn.read(() -> "elementWriter").typedMarshallable();
    }

    @Override
    public void writeMarshallable(@NotNull WireOut wireOut) {
        wireOut.write(() -> "elementReader").typedMarshallable(elementReader);
        wireOut.write(() -> "elementWriter").typedMarshallable(elementWriter);
    }
}

        int size = in.readInt();
        if (using == null) {
            using = new ArrayList<>(size);
            for (int i = 0; i < size; i++) {
                using.add(null);
            }
        } else if (using.size() < size) {
            while (using.size() < size) {
                using.add(null);
            }
        } else if (using.size() > size) {
            using.subList(size, using.size()).clear();
        }
        for (int i = 0; i < size; i++) {
            using.set(i, elementReader.read(in, using.get(i)));
        }
        return using;
    
<no_super_class>