A ISubTypeSerializer <A> .ReadSubType(ref ProtoReader.State state, SubTypeState <A> value) { int field; value.OnBeforeDeserialize((obj, ctx) => obj.OnBeforeDeserialize()); while ((field = state.ReadFieldHeader()) != 0) { switch (field) { case 1: value.Value.AVal = state.ReadInt32(); break; case 4: value.ReadSubType <B>(ref state, this); break; default: state.SkipField(); break; } } value.Value.OnAfterDeserialize(); return(value.Value); }
T ISubTypeSerializer <T> .ReadSubType(ref ProtoReader.State state, SubTypeState <T> value) { value.OnBeforeDeserialize(_subTypeOnBeforeDeserialize); DeserializeBody(ref state, ref value, (ref SubTypeState <T> s) => s.Value, (ref SubTypeState <T> s, T v) => s.Value = v); var val = value.Value; Callback(ref val, TypeModel.CallbackType.AfterDeserialize, state.Context); return(val); }
T ISubTypeSerializer <T> .ReadSubType(ref ProtoReader.State state, SubTypeState <T> value) { bool isFirst = Interlocked.Increment(ref _subDeserializeCount) == 1; if (isFirst) { RuntimeTypeModel.OnDebugLog("Pre first sub-read", typeof(T)); } var ret = subTypeDeserializer(ref state, value); if (isFirst) { RuntimeTypeModel.OnDebugLog("Pre first sub-read", typeof(T)); } return(ret); }
C ISubTypeSerializer <C> .ReadSubType(ref ProtoReader.State state, SubTypeState <C> value) { int field; while ((field = state.ReadFieldHeader()) != 0) { switch (field) { case 3: value.Value.CVal = state.ReadInt32(); break; default: state.SkipField(); break; } } return(value.Value); }
C ISerializer <C> .Read(ref ProtoReader.State state, C value) => (C)((ISubTypeSerializer <A>) this).ReadSubType(ref state, SubTypeState <A> .Create <C>(state.Context, value));
T ISubTypeSerializer <T> .ReadSubType(ref ProtoReader.State state, SubTypeState <T> value) { return(subTypeDeserializer(ref state, value)); }