Пример #1
0
        public void TestLoadingSavingFile00()
        {
            try
            {
                IStorage s1 = new FileStorage();
                IStorage s2 = new FileStorage();

                string str = "World Hello";
                byte[] bytes = Encoding.ASCII.GetBytes(str);
                ulong signature = Utilities.MakeEightCC('T', 'E', 'S', 'T', ' ', ' ', ' ', ' ');

                s1.WriteBytes(signature, bytes);
                s1.WriteInteger(signature, 24);
                s1.WriteUnsignedInteger(signature, 2147483648);
                s1.WriteLong(signature, 3000000000);
                s1.WriteUnsignedLong(signature, 9223372036854775808);
                s1.WriteBoolean(signature, true);
                s1.WriteDouble(signature, 1.7);
                s1.WriteString(signature, "Hello World");

                string filePath = Path.GetTempPath() + "test.bin";
                ((FileStorage)s1).Save(filePath);
                ((FileStorage)s2).Load(filePath);

                byte[] a = s2.ReadBytes(signature);
                int b = s2.ReadInteger(signature);
                uint c = s2.ReadUnsignedInteger(signature);
                long d = s2.ReadLong(signature);
                ulong e = s2.ReadUnsignedLong(signature);
                bool f = s2.ReadBoolean(signature);
                double g = s2.ReadDouble(signature);
                string h = s2.ReadString(signature);

                Assert.AreEqual(bytes, a);
                Assert.AreEqual(24, b);
                Assert.AreEqual(2147483648, c);
                Assert.AreEqual(3000000000, d);
                Assert.AreEqual(9223372036854775808, e);
                Assert.AreEqual(true, f);
                Assert.AreEqual(1.7, g);
                Assert.AreEqual("Hello World", h);
            }
            finally
            {
                File.Delete(Path.GetTempPath() + "test.bin");
            }
        }
        private void SaveFileInternal(string filePath)
        {
            IStorage storage = new FileStorage();
            DataHeader header = new DataHeader();
            long initialPosition, currentPosition = 0;

            //Serialize states
            storage.Seek(header.HeaderSize, SeekOrigin.Current);
            initialPosition = storage.GetPosition();
            this.graphProperties.Serialize(storage);
            currentPosition = storage.GetPosition();
            header.DataSize = currentPosition - initialPosition;
            storage.Seek(-(header.HeaderSize + header.DataSize), SeekOrigin.Current);
            header.Serialize(storage);
            storage.Seek(header.DataSize, SeekOrigin.Current);

            //Serialize slots
            List<ISlot> slotList = new List<ISlot>(this.slotCollection.Values);
            storage.WriteInteger(FieldCode.SlotCount, slotList.Count);
            foreach (ISlot slot in slotList)
            {
                storage.Seek(header.HeaderSize, SeekOrigin.Current);
                initialPosition = storage.GetPosition();
                slot.Serialize(storage);
                currentPosition = storage.GetPosition();
                header.DataSize = currentPosition - initialPosition;
                storage.Seek(-(header.HeaderSize + header.DataSize), SeekOrigin.Current);
                header.Serialize(storage);
                storage.Seek(header.DataSize, SeekOrigin.Current);
            }

            //Serialize nodes
            List<IVisualNode> nodeList = new List<IVisualNode>(this.nodeCollection.Values);
            storage.WriteInteger(FieldCode.NodeCount, nodeList.Count);
            foreach (IVisualNode node in nodeList)
            {
                storage.Seek(header.HeaderSize, SeekOrigin.Current);
                initialPosition = storage.GetPosition();
                node.Serialize(storage);
                currentPosition = storage.GetPosition();
                header.DataSize = currentPosition - initialPosition;
                storage.Seek(-(header.HeaderSize + header.DataSize), SeekOrigin.Current);
                header.Serialize(storage);
                storage.Seek(header.DataSize, SeekOrigin.Current);
            }

            //Serialize edges
            List<IVisualEdge> edgeList = this.edgeController.GetVisualEdges();
            storage.WriteInteger(FieldCode.EdgeCount, edgeList.Count);
            foreach (IVisualEdge edge in edgeList)
            {
                storage.Seek(header.HeaderSize, SeekOrigin.Current);
                initialPosition = storage.GetPosition();
                edge.Serialize(storage);
                currentPosition = storage.GetPosition();
                header.DataSize = currentPosition - initialPosition;
                storage.Seek(-(header.HeaderSize + header.DataSize), SeekOrigin.Current);
                header.Serialize(storage);
                storage.Seek(header.DataSize, SeekOrigin.Current);
            }

            ((FileStorage)storage).Save(filePath);
        }