using System;
namespace ProtoBuf
{
///
/// Represents the ability to serialize values to an output of type
///
public interface IProtoOutput
{
///
/// Serialize the provided value
///
void Serialize(TOutput destination, T value, object userState = null);
}
///
/// Represents the ability to serialize values to an output of type
/// with pre-computation of the length
///
public interface IMeasuredProtoOutput : IProtoOutput
{
///
/// Measure the length of a value in advance of serialization
///
MeasureState Measure(T value, object userState = null);
///
/// Serialize the previously measured value
///
void Serialize(MeasureState measured, TOutput destination);
}
///
/// Represents the outcome of computing the length of an object; since this may have required computing lengths
/// for multiple objects, some metadata is retained so that a subsequent serialize operation using
/// this instance can re-use the previously calculated lengths. If the object state changes between the
/// measure and serialize operations, the behavior is undefined.
///
public struct MeasureState : IDisposable
// note: 2.4.* does not actually implement this API;
// it only advertises it for 3.* capability/feature-testing, i.e.
// callers can check whether a model implements
// IMeasuredProtoOutput, and *work from that*
{
///
/// Releases all resources associated with this value
///
public void Dispose() => throw new NotImplementedException();
///
/// Gets the calculated length of this serialize operation, in bytes
///
public long Length => throw new NotImplementedException();
}
}