コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: ObjectReader.cs プロジェクト: gjulianm/Migrant
        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);
        }
コード例 #4
0
ファイル: ObjectReader.cs プロジェクト: fnicollier/Migrant
        /// <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);
        }
コード例 #5
0
        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);
        }