/*
 * Copyright 2007 Google 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.google.gwt.user.client.rpc;

/**
 * An interface for creating {@link SerializationStreamReader}s and
 * {@link SerializationStreamWriter}s.
 */
public interface SerializationStreamFactory {

  /**
   * Creates a {@link SerializationStreamReader} for the encoded string.
   * 
   * @param encoded an encoded serialization stream
   * @return {@link SerializationStreamReader} for the encoded string
   * @throws SerializationException if the encoded string is not a valid
   *           serialization stream
   */
  SerializationStreamReader createStreamReader(String encoded)
      throws SerializationException;

  /**
   * Creates a {@link SerializationStreamWriter}.
   * 
   * @return a {@link SerializationStreamWriter}
   */
  SerializationStreamWriter createStreamWriter();
}
