public void Deserialize(BinaryReader reader, InverseLookup.LookupCallback callback) { SaveCheckpoint(reader); var type = DeserializeType(reader); if (type == null) { LoadCheckpoint(reader); callback(null); } else if (type.IsSubclassOf(typeof(Type))) { callback(DeserializeType(reader)); } else if (type.IsClass) { DeserializeReference(type, reader, callback); } else if (type.IsValueType) { callback(DeserializeValue(type, reader)); } else { throw new NotSupportedException(); } }
public void DeserializeReference(Type type, BinaryReader reader, InverseLookup.LookupCallback callback) { int refType = reader.ReadByte(); switch (refType) { case 0: callback(null); break; case 1: { var id = reader.ReadInt32(); if (mInverseLookupMap.ContainsKey(id) && mInverseLookupMap[id].settled) { callback(mInverseLookupMap[id].value); } else { if (!mInverseLookupMap.ContainsKey(id)) { mInverseLookupMap.Add(id, new InverseLookup()); } mInverseLookupMap[id].callback += callback; } break; } case 2: { var id = reader.ReadInt32(); callback(mRegisterInverseLookupMap[id].value); break; } case 8: { var id = reader.ReadInt32(); var reference = DeserializeStructure(type, reader); if (!mInverseLookupMap.ContainsKey(id)) { mInverseLookupMap.Add(id, new InverseLookup()); } mInverseLookupMap[id].settled = true; mInverseLookupMap[id].value = reference; mInverseLookupMap[id].callback(reference); callback(reference); break; } default: throw new NotSupportedException(); } }