Esempio n. 1
0
        public void Serialize(Stream s)
        {
            SerializedListNode[]       serializedData = new SerializedListNode[Count];
            Dictionary <ListNode, int> indexator      = new Dictionary <ListNode, int>(); //Необходимо для преобразования ссылки в число

            ListNode temp = Head;

            for (int i = 0; i < Count; i++)
            {
                indexator.Add(temp, i);
                serializedData[i] = new SerializedListNode(-1, temp.Data, temp); //-1 == null
                temp = temp.Next;
            }

            //Заменяем ссылки на номера
            for (int i = 0; i < Count; i++)
            {
                serializedData[i].randomNodeId = indexator[serializedData[i].serialized.Random];
            }

            using (BinaryWriter bw = new BinaryWriter(s))
            {
                bw.Write(Count);

                for (int i = 0; i < Count; i++)
                {
                    bw.Write(serializedData[i].randomNodeId);
                    bw.Write(serializedData[i].data);
                }
            }
        }
Esempio n. 2
0
        public void Deserialize(Stream s)
        {
            SerializedListNode[] serializedData;

            using (BinaryReader br = new BinaryReader(s))
            {
                Count = br.ReadInt32();

                serializedData = new SerializedListNode[Count];
                for (int i = 0; i < Count; i++)
                {
                    serializedData[i].randomNodeId = br.ReadInt32();
                    serializedData[i].data         = br.ReadString();
                }
            }

            Head = new ListNode
            {
                Data = serializedData[0].data
            };

            ListNode prev = Head;

            ListNode[] indexator = new ListNode[Count];

            //Восстанавливаем ссылки полей Next, Previous
            indexator[0] = prev;
            for (int i = 1; i < Count; i++)
            {
                ListNode current = new ListNode
                {
                    Data     = serializedData[i].data,
                    Previous = prev
                };
                prev.Next = current;
                prev      = current;

                indexator[i] = prev;
            }
            Tail = prev;

            //Восстанавливаем ссылки на поле Random
            for (int i = 0; i < Count; i++)
            {
                indexator[i].Random = indexator[serializedData[i].randomNodeId];
            }
        }