64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
#if !NO_RUNTIME
 | 
						|
using System;
 | 
						|
using System.Reflection;
 | 
						|
using ProtoBuf.Meta;
 | 
						|
 | 
						|
namespace ProtoBuf.Serializers
 | 
						|
{
 | 
						|
    sealed class NetObjectSerializer : IProtoSerializer
 | 
						|
    {
 | 
						|
        private readonly int key;
 | 
						|
        private readonly Type type;
 | 
						|
 | 
						|
        private readonly BclHelpers.NetObjectOptions options;
 | 
						|
 | 
						|
        public NetObjectSerializer(TypeModel model, Type type, int key, BclHelpers.NetObjectOptions options)
 | 
						|
        {
 | 
						|
            bool dynamicType = (options & BclHelpers.NetObjectOptions.DynamicType) != 0;
 | 
						|
            this.key = dynamicType ? -1 : key;
 | 
						|
            this.type = dynamicType ? model.MapType(typeof(object)) : type;
 | 
						|
            this.options = options;
 | 
						|
        }
 | 
						|
 | 
						|
        public Type ExpectedType => type;
 | 
						|
 | 
						|
        public bool ReturnsValue => true;
 | 
						|
 | 
						|
        public bool RequiresOldValue => true;
 | 
						|
 | 
						|
        public object Read(object value, ProtoReader source)
 | 
						|
        {
 | 
						|
            return BclHelpers.ReadNetObject(value, source, key, type == typeof(object) ? null : type, options);
 | 
						|
        }
 | 
						|
 | 
						|
        public void Write(object value, ProtoWriter dest)
 | 
						|
        {
 | 
						|
            BclHelpers.WriteNetObject(value, dest, key, options);
 | 
						|
        }
 | 
						|
 | 
						|
#if FEAT_COMPILER
 | 
						|
        public void EmitRead(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
 | 
						|
        {
 | 
						|
            ctx.LoadValue(valueFrom);
 | 
						|
            ctx.CastToObject(type);
 | 
						|
            ctx.LoadReaderWriter();
 | 
						|
            ctx.LoadValue(ctx.MapMetaKeyToCompiledKey(key));
 | 
						|
            if (type == ctx.MapType(typeof(object))) ctx.LoadNullRef();
 | 
						|
            else ctx.LoadValue(type);
 | 
						|
            ctx.LoadValue((int)options);
 | 
						|
            ctx.EmitCall(ctx.MapType(typeof(BclHelpers)).GetMethod("ReadNetObject"));
 | 
						|
            ctx.CastFromObject(type);
 | 
						|
        }
 | 
						|
        public void EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
 | 
						|
        {
 | 
						|
            ctx.LoadValue(valueFrom);
 | 
						|
            ctx.CastToObject(type);
 | 
						|
            ctx.LoadReaderWriter();
 | 
						|
            ctx.LoadValue(ctx.MapMetaKeyToCompiledKey(key));
 | 
						|
            ctx.LoadValue((int)options);
 | 
						|
            ctx.EmitCall(ctx.MapType(typeof(BclHelpers)).GetMethod("WriteNetObject"));
 | 
						|
        }
 | 
						|
#endif
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif |