/// <summary> /// Starts reading an reference that was written with <see cref="StartWrite"/>. /// </summary> /// <returns></returns> public ObjectReference StartRead() { var name = ReadLine(); int line = m_currentLine; var serializationType = (SerializationType)Enum.Parse(typeof(SerializationType), ReadLine()); var objReference = new ObjectReference(name, serializationType); if (serializationType > SerializationType.ReferenceTypes) { ObjectReferences.Add(line, objReference); } switch (serializationType) { case SerializationType.Null: break; case SerializationType.Reference: ReadReference(objReference); break; case SerializationType.Object: ReadObject(objReference); break; case SerializationType.Array: ReadArray(objReference); break; case SerializationType.GenericEnumerable: ReadGenericEnumerable(objReference); break; case SerializationType.Enumerable: ReadEnumerable(objReference); break; case SerializationType.Enum: ReadEnum(objReference); break; case SerializationType.Any: ReadAny(objReference); break; case SerializationType.String: ReadString(objReference); break; case SerializationType.MemberInfo: ReadMemberInfo(objReference); break; case SerializationType.Type: ReadType(objReference); break; case SerializationType.Delegate: ReadDelegate(objReference); break; case SerializationType.IntPtr: ReadIntPtr(objReference); break; case SerializationType.UnusedMarker: ReadUnusedMarker(objReference); break; } #if !(RELEASE && RELEASE_DISABLE_CHECKS) if (!objReference.AllowNull && objReference.Value == null && serializationType != SerializationType.Null) { throw new SerializationException(string.Format("Failed to deserialize object of type {0} {1} at line {2}!", objReference.SerializationType, objReference.Name, line)); } #endif return(objReference); }
/// <summary> /// Checks if this object has already been serialized. /// </summary> /// <param name="objectReference"></param> /// <returns>true if object had already been serialized.</returns> bool TryWriteReference(ObjectReference objectReference) { if (objectReference.SerializationType > SerializationType.ReferenceTypes) { foreach (var pair in ObjectReferences) { if (pair.Value.Value.Equals(objectReference.Value)) { WriteReference(objectReference, pair.Key); return(true); } } ObjectReferences.Add(m_currentLine, objectReference); } return(false); }