com.google.cloud.dataflow.sdk.coders

## Class CustomCoder<T>

- java.lang.Object
- - com.google.cloud.dataflow.sdk.coders.StandardCoder<T>
  - - com.google.cloud.dataflow.sdk.coders.DeterministicStandardCoder<T>
    - - com.google.cloud.dataflow.sdk.coders.AtomicCoder<T>
      - - com.google.cloud.dataflow.sdk.coders.CustomCoder<T>

Type Parameters:
  `T` - the type of elements handled by this coder

All Implemented Interfaces:
  Coder<T>, Serializable

Direct Known Subclasses:
  DelegateCoder

    public abstract class CustomCoder<T>
    extends AtomicCoder<T>
    implements Serializable

An abstract base class for writing a `Coder` class that encodes itself via Java serialization.

To complete an implementation, subclasses must implement `Coder.encode(T, java.io.OutputStream, com.google.cloud.dataflow.sdk.coders.Coder.Context)` and `Coder.decode(java.io.InputStream, com.google.cloud.dataflow.sdk.coders.Coder.Context)` methods. Anonymous subclasses must furthermore override `getEncodingId()`.

Not to be confused with `SerializableCoder` that encodes objects that implement the `Serializable` interface.

See Also:
  Serialized Form

### Nested Class Summary

### Nested classes/interfaces inherited from interface com.google.cloud.dataflow.sdk.coders.Coder

`Coder.Context, Coder.NonDeterministicException`

### Constructor Summary

Constructors
Constructor and Description
`CustomCoder()`

### Method Summary

All Methods Static Methods Instance Methods Concrete Methods
`com.google.cloud.dataflow.sdk.util.CloudObject` `asCloudObject()` Returns the `CloudObject` that represents this `Coder`.
`String` `getEncodingId()` An identifier for the binary format written by `Coder.encode(T, java.io.OutputStream, com.google.cloud.dataflow.sdk.coders.Coder.Context)`.
`static CustomCoder<?>` `of(String typeId, String encodingId, String type, String serializedCoder)`
`void` `verifyDeterministic()` Throw `Coder.NonDeterministicException` if the coding is not deterministic.

### Methods inherited from class com.google.cloud.dataflow.sdk.coders.AtomicCoder

`getCoderArguments, getInstanceComponents`

### Methods inherited from class com.google.cloud.dataflow.sdk.coders.StandardCoder

`consistentWithEquals, equals, getAllowedEncodings, getComponents, getEncodedElementByteSize, hashCode, isRegisterByteSizeObserverCheap, registerByteSizeObserver, structuralValue, toString, verifyDeterministic, verifyDeterministic`

### Methods inherited from class java.lang.Object

`clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

### Methods inherited from interface com.google.cloud.dataflow.sdk.coders.Coder

`decode, encode`

### Constructor Detail

#### CustomCoder

    public CustomCoder()

### Method Detail

#### of

    public static CustomCoder<?> of(String typeId,
                                    String encodingId,
                                    String type,
                                    String serializedCoder)

#### asCloudObject

    public com.google.cloud.dataflow.sdk.util.CloudObject asCloudObject()

Returns the `CloudObject` that represents this `Coder`.

Specified by:
  `asCloudObject` in interface `Coder<T>`
Overrides:
  `asCloudObject` in class `StandardCoder<T>`
Returns:
  A thin `CloudObject` wrapping of the Java serialization of `this`.

#### verifyDeterministic

    public void verifyDeterministic()
                             throws Coder.NonDeterministicException

Throw `Coder.NonDeterministicException` if the coding is not deterministic.

In order for a `Coder` to be considered deterministic, the following must be true:

- two values that compare as equal (via `Object.equals()` or `Comparable.compareTo()`, if supported) have the same encoding.
- the `Coder` always produces a canonical encoding, which is the same for an instance of an object even if produced on different computers at different times.

Specified by:
  `verifyDeterministic` in interface `Coder<T>`
Overrides:
  `verifyDeterministic` in class `DeterministicStandardCoder<T>`
Throws:
  `NonDeterministicException` - a `CustomCoder` is presumed nondeterministic.
  `Coder.NonDeterministicException` - if this coder is not deterministic.

#### getEncodingId

    public String getEncodingId()

An identifier for the binary format written by `Coder.encode(T, java.io.OutputStream, com.google.cloud.dataflow.sdk.coders.Coder.Context)`.

This value, along with the fully qualified class name, forms an identifier for the binary format of this coder. Whenever this value changes, the new encoding is considered incompatible with the prior format: It is presumed that the prior version of the coder will be unable to correctly read the new format and the new version of the coder will be unable to correctly read the old format.

If the format is changed in a backwards-compatible way (the Coder can still accept data from the prior format), such as by adding optional fields to a Protocol Buffer or Avro definition, and you want Dataflow to understand that the new coder is compatible with the prior coder, this value must remain unchanged. It is then the responsibility of `Coder.decode(java.io.InputStream, com.google.cloud.dataflow.sdk.coders.Coder.Context)` to correctly read data from the prior format.

Specified by:
  `getEncodingId` in interface `Coder<T>`
Overrides:
  `getEncodingId` in class `StandardCoder<T>`
Returns:
  The canonical class name for this coder. For stable data formats that are independent of class name, it is recommended to override this method.
Throws:
  `UnsupportedOperationException` - when an anonymous class is used, since they do not have a stable canonical class name.