blob: d85ec9f22abf5a81a014e29355bc6aa4a3849439 [file] [log] [blame]
/**
* Copyright (C) 2015 DataTorrent, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.datatorrent.api;
import com.datatorrent.netlet.util.Slice;
/**
* Serializing and Deserializing the data tuples and controlling the partitioning
* <p>
* Data flows from one Operator to another Operator through a stream.Typically
* StreamCodec is defined on each input stream and is able to
* serialize/deserialize and partition the data of type supported by the stream.
* <br />
* <br />
* For a few known types, the system is able to determine the StreamCodec. In
* all other cases, it would need user to define the codec on each input stream.
* <br />
* <br />
* In the physical layout, each codec has at least 2 instances - serializer
* instance which attaches itself to the stream coming out of upstream operator
* and deserializer instance which attaches itself to input stream of downstream
* operator.
*
* @param <T> data type of the tuples on the stream
* @since 0.3.2
*/
public interface StreamCodec<T>
{
/**
* Create POJO from the byte array for consumption by the downstream.
*
* @param fragment
* @return plain old java object, the type is intentionally not T since the consumer does not care about it.
*/
Object fromByteArray(Slice fragment);
/**
* Serialize the POJO emitted by the upstream node to byte array so that
* it can be transmitted or stored in file
*
* @param o plain old java object
* @return serialized representation of the object
*/
Slice toByteArray(T o);
/**
* Get the partition on the object to be delivered to the downstream
* so that it can be sent to appropriate downstream node if the load
* balancing per partition is in effect.
*
* @param o object for which the partition has to be determined
* @return partition for the object
*/
int getPartition(T o);
}