#if !NO_RUNTIME
using System;
namespace ProtoBuf.Serializers
{
    interface IProtoSerializer
    {
        /// 
        /// The type that this serializer is intended to work for.
        /// 
        Type ExpectedType { get; }
        /// 
        /// Perform the steps necessary to serialize this data.
        /// 
        /// The value to be serialized.
        /// The writer entity that is accumulating the output data.
        void Write(object value, ProtoWriter dest);
        /// 
        /// Perform the steps necessary to deserialize this data.
        /// 
        /// The current value, if appropriate.
        /// The reader providing the input data.
        /// The updated / replacement value.
        object Read(object value, ProtoReader source);
        /// 
        /// Indicates whether a Read operation replaces the existing value, or
        /// extends the value. If false, the "value" parameter to Read is
        /// discarded, and should be passed in as null.
        /// 
        bool RequiresOldValue { get; }
        /// 
        /// Now all Read operations return a value (although most do); if false no
        /// value should be expected.
        /// 
        bool ReturnsValue { get; }
#if FEAT_COMPILER
        /// Emit the IL necessary to perform the given actions
        /// to serialize this data.
        /// 
        /// Details and utilities for the method being generated.
        /// The source of the data to work against;
        /// If the value is only needed once, then LoadValue is sufficient. If
        /// the value is needed multiple times, then note that a "null"
        /// means "the top of the stack", in which case you should create your
        /// own copy - GetLocalWithValue.
        void EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom);
        /// 
        /// Emit the IL necessary to perform the given actions to deserialize this data.
        /// 
        /// Details and utilities for the method being generated.
        /// For nested values, the instance holding the values; note
        /// that this is not always provided - a null means not supplied. Since this is always
        /// a variable or argument, it is not necessary to consume this value.
        void EmitRead(Compiler.CompilerContext ctx, Compiler.Local entity);
#endif
    }
}
#endif