All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.elasticsearch.common.io.stream.Writeable Maven / Gradle / Ivy

There is a newer version: 8.13.4
Show newest version
/*
 * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
 * or more contributor license agreements. Licensed under the Elastic License
 * 2.0 and the Server Side Public License, v 1; you may not use this file except
 * in compliance with, at your election, the Elastic License 2.0 or the Server
 * Side Public License, v 1.
 */

package org.elasticsearch.common.io.stream;

import java.io.IOException;

/**
 * Implementers can be written to a {@linkplain StreamOutput} and read from a {@linkplain StreamInput}. This allows them to be "thrown
 * across the wire" using Elasticsearch's internal protocol. If the implementer also implements equals and hashCode then a copy made by
 * serializing and deserializing must be equal and have the same hashCode. It isn't required that such a copy be entirely unchanged.
 */
public interface Writeable {

    /**
     * Write this into the {@linkplain StreamOutput}.
     */
    void writeTo(StreamOutput out) throws IOException;

    /**
     * Reference to a method that can write some object to a {@link StreamOutput}.
     * 

* By convention this is a method from {@link StreamOutput} itself (e.g., {@link StreamOutput#writeString}). If the value can be * {@code null}, then the "optional" variant of methods should be used! *

* Most classes should implement {@link Writeable} and the {@link Writeable#writeTo(StreamOutput)} method should use * {@link StreamOutput} methods directly or this indirectly: *


     * public void writeTo(StreamOutput out) throws IOException {
     *     out.writeVInt(someValue);
     *     out.writeMapOfLists(someMap, StreamOutput::writeString, StreamOutput::writeString);
     * }
     * 
*/ @FunctionalInterface interface Writer { /** * Write {@code V}-type {@code value} to the {@code out}put stream. * * @param out Output to write the {@code value} too * @param value The value to add */ void write(StreamOutput out, V value) throws IOException; } /** * Reference to a method that can read some object from a stream. By convention this is a constructor that takes * {@linkplain StreamInput} as an argument for most classes and a static method for things like enums. Returning null from one of these * is always wrong - for that we use methods like {@link StreamInput#readOptionalWriteable(Reader)}. *

* As most classes will implement this via a constructor (or a static method in the case of enumerations), it's something that should * look like: *


     * public MyClass(final StreamInput in) throws IOException {
     *     this.someValue = in.readVInt();
     *     this.someMap = in.readMapOfLists(StreamInput::readString, StreamInput::readString);
     * }
     * 
*/ @FunctionalInterface interface Reader { /** * Read {@code V}-type value from a stream. * * @param in Input to read the value from */ V read(StreamInput in) throws IOException; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy