initial commit
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace ProtoBuf;
|
||||
|
||||
public sealed class SerializationContext
|
||||
{
|
||||
private bool frozen;
|
||||
|
||||
private object context;
|
||||
|
||||
private static readonly SerializationContext @default;
|
||||
|
||||
private StreamingContextStates state = StreamingContextStates.Persistence;
|
||||
|
||||
public object Context
|
||||
{
|
||||
get
|
||||
{
|
||||
return context;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (context != value)
|
||||
{
|
||||
ThrowIfFrozen();
|
||||
context = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static SerializationContext Default => @default;
|
||||
|
||||
public StreamingContextStates State
|
||||
{
|
||||
get
|
||||
{
|
||||
return state;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (state != value)
|
||||
{
|
||||
ThrowIfFrozen();
|
||||
state = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void Freeze()
|
||||
{
|
||||
frozen = true;
|
||||
}
|
||||
|
||||
private void ThrowIfFrozen()
|
||||
{
|
||||
if (frozen)
|
||||
{
|
||||
throw new InvalidOperationException("The serialization-context cannot be changed once it is in use");
|
||||
}
|
||||
}
|
||||
|
||||
static SerializationContext()
|
||||
{
|
||||
@default = new SerializationContext();
|
||||
@default.Freeze();
|
||||
}
|
||||
|
||||
public static implicit operator StreamingContext(SerializationContext ctx)
|
||||
{
|
||||
if (ctx == null)
|
||||
{
|
||||
return new StreamingContext(StreamingContextStates.Persistence);
|
||||
}
|
||||
return new StreamingContext(ctx.state, ctx.context);
|
||||
}
|
||||
|
||||
public static implicit operator SerializationContext(StreamingContext ctx)
|
||||
{
|
||||
SerializationContext serializationContext = new SerializationContext();
|
||||
serializationContext.Context = ctx.Context;
|
||||
serializationContext.State = ctx.State;
|
||||
return serializationContext;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user