public IEnumerable <string> GetAllNames() { var nameSegments = new AutoResizingList <string>(); var names = new List <string>(); lock (collectionSync) { registeredPeripherals.TraverseParentFirst((x, y) => { if (!localNames.ContainsKey(x)) { // unnamed node return; } var localName = localNames[x]; nameSegments[y] = localName; var globalName = new StringBuilder(); for (var i = 0; i < y; i++) { globalName.Append(nameSegments[i]); globalName.Append(PathSeparator); } globalName.Append(localName); names.Add(globalName.ToString()); }, 0); } return(new ReadOnlyCollection <string>(names)); }
public T ReadObject <T>() { if (soFarDeserialized != null) { deserializedObjects = new AutoResizingList <object>(soFarDeserialized.Length); for (var i = 0; i < soFarDeserialized.Length; i++) { deserializedObjects[i] = soFarDeserialized[i].Target; } } if (deserializedObjects == null) { deserializedObjects = new AutoResizingList <object>(InitialCapacity); } objectsWrittenInlineCount = 0; var before = deserializedObjects.Count; var theRefId = ReadAndTouchReference(); if (theRefId == before) { var after = deserializedObjects.Count; if (before < after - objectsWrittenInlineCount) { int prevRefId; int refId = -1; do { prevRefId = refId; refId = reader.ReadInt32(); var type = GetObjectByReferenceId(refId).GetType(); readMethods.readMethodsProvider.GetOrCreate(type)(this, type, refId); // this is to compensate objects written inline that has been already counted objectsWrittenInlineCount -= (refId - prevRefId - 1); }while(deserializedObjects.Count - before - refId - objectsWrittenInlineCount > 1); } } for (var i = deserializedObjects.Count - 1; i >= 0; i--) { Completed(i); } var obj = deserializedObjects[theRefId]; if (!(obj is T)) { throw new InvalidDataException( string.Format("Type {0} requested to be deserialized, however type {1} encountered in the stream.", typeof(T), obj.GetType())); } PrepareForNextRead(); foreach (var hook in postDeserializationHooks) { hook(); } return((T)obj); }
private void PrepareForTheRead() { if (reader != null) { reader.Dispose(); } delegatesCache = new Dictionary <Type, Func <int, object> >(); deserializedObjects = new AutoResizingList <object>(InitialCapacity); reader = new PrimitiveReader(stream); stamper = new TypeStampReader(reader, versionToleranceLevel); }
/// <summary> /// Reads the object with the expected formal type <typeparam name='T'/>. /// </summary> /// <returns> /// The object, previously written by the <see cref="Antmicro.Migrant.ObjectWriter" />. /// </returns> /// <typeparam name='T'> /// The expected formal type of object, that is the type of the reference returned /// by the method after serialization. The previously serialized object must be /// convertible to this type. /// </typeparam> /// <remarks> /// Note that this method will read the object from the stream along with other objects /// referenced by it. /// </remarks> public T ReadObject <T>() { if (soFarDeserialized != null) { deserializedObjects = new AutoResizingList <object>(soFarDeserialized.Length); for (var i = 0; i < soFarDeserialized.Length; i++) { deserializedObjects[i] = soFarDeserialized[i].Target; } } if (deserializedObjects == null) { deserializedObjects = new AutoResizingList <object>(InitialCapacity); } var firstObjectId = deserializedObjects.Count; var type = ReadType(); if (useGeneratedDeserialization) { ReadObjectInnerGenerated(type, firstObjectId); } else { ReadObjectInner(type, firstObjectId); } var obj = deserializedObjects[firstObjectId]; if (!(obj is T)) { throw new InvalidDataException( string.Format("Type {0} requested to be deserialized, however type {1} encountered in the stream.", typeof(T), obj.GetType())); } PrepareForNextRead(); foreach (var hook in postDeserializationHooks) { hook(); } return((T)obj); }
private static void GenerateReadDelegateStaticHelper(MethodInfo method, Type t, object target, AutoResizingList <object> deserializedObjects, int objectId) { var del = Delegate.CreateDelegate(t, target, method); deserializedObjects[objectId] = Delegate.Combine((Delegate)deserializedObjects[objectId], del); }