/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * 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 signature.io;

import signature.model.IApi;

import java.io.IOException;

/**
 * This interface is used to write API definitions. Possible implementations of
 * this interface use Java serialization to store the API in binary form on the
 * disk. An alternative implementation can use ASCII files.
 */
public interface IApiExternalizer {
    void externalizeApi(String loacation, IApi signature) throws IOException;
}
