Пример #1
0
        public bool LoadFromStream(Stream stream)
        {
            if (stream == null || !stream.CanRead)
            {
                return(false);
            }

            ConfigFileHeader header = new ConfigFileHeader();

            header.SeekFileToHeader(stream);
            if (!header.LoadFromStream(stream) || !header.IsVaild)
            {
                return(false);
            }

            if (!header.IsSplitFile)
            {
                return(false);
            }

            // 索引偏移
            stream.Seek(header.indexOffset, SeekOrigin.Begin);

            ConfigWrap.ConfigValueType valueType = (ConfigWrap.ConfigValueType)stream.ReadByte();
            m_ValueType = valueType;

            switch (valueType)
            {
            case ConfigWrap.ConfigValueType.cvObject:
                LoadObjectIndex(header, stream);
                break;

            case ConfigWrap.ConfigValueType.cvList:
                LoadListIndex(header, stream);
                break;

            case ConfigWrap.ConfigValueType.cvMap:
                LoadMapIndex(header, stream);
                break;

            default:
                return(false);
            }

            return(true);
        }
Пример #2
0
        internal static bool ToStream(Stream stream, System.Collections.IDictionary values)
        {
            if (stream == null || values == null || values.Count <= 0)
            {
                return(false);
            }

            ConfigFileHeader header = new ConfigFileHeader((uint)values.Count, 0);

            header.SaveToStream(stream);

            var             iter      = values.GetEnumerator();
            ConfigValueType valueType = ConfigValueType.cvObject;

            while (iter.MoveNext())
            {
                IList       vs     = iter.Value as IList;
                IDictionary subMap = iter.Value as IDictionary;
                if (vs != null)
                {
                    // 说明是List
                    valueType = ConfigValueType.cvList;
                    long dataOffset = stream.Position;
                    for (int i = 0; i < vs.Count; ++i)
                    {
                        IConfigBase v = vs[i] as IConfigBase;
                        v.stream     = stream;
                        v.dataOffset = dataOffset;
                        v.WriteValue();
                    }
                }
                else if (subMap != null)
                {
                    // 字典类型
                    valueType = ConfigValueType.cvMap;
                    long dataOffset = stream.Position;
                    var  subIter    = subMap.GetEnumerator();
                    while (subIter.MoveNext())
                    {
                        IConfigBase v = subIter.Value as IConfigBase;
                        v.stream     = stream;
                        v.dataOffset = dataOffset;
                        v.WriteValue();
                    }
                    subIter.DisposeIter();
                }
                else
                {
                    // 普通对象类型
                    valueType = ConfigValueType.cvObject;
                    IConfigBase v = iter.Value as IConfigBase;
                    v.stream     = stream;
                    v.dataOffset = stream.Position;
                    v.WriteValue();
                }
            }
            iter.DisposeIter();

            long indexOffset = stream.Position;

            stream.WriteByte((byte)valueType);

            if (valueType == ConfigValueType.cvList)
            {
                iter = values.GetEnumerator();
                while (iter.MoveNext())
                {
                    System.Object key = iter.Key;
                    IList         vs  = iter.Value as IList;
                    if (vs != null)
                    {
                        IConfigBase v = vs[0] as IConfigBase;
                        v.WriteKey(key);
                        // 偏移
                        FilePathMgr.Instance.WriteLong(stream, v.dataOffset);
                        // 数量
                        FilePathMgr.Instance.WriteInt(stream, vs.Count);
                    }
                }
                iter.DisposeIter();
            }
            else if (valueType == ConfigValueType.cvMap)
            {
                // 字典类型
                iter = values.GetEnumerator();
                while (iter.MoveNext())
                {
                    System.Object key = iter.Key;
                    IDictionary   vs  = iter.Value as IDictionary;
                    if (vs != null)
                    {
                        var subIter = vs.GetEnumerator();
                        // 取出第一个
                        if (subIter.MoveNext())
                        {
                            IConfigBase v = subIter.Value as IConfigBase;
                            FilePathMgr.Instance.WriteObject(stream, key, v.GetKeyType());
                            // 偏移
                            FilePathMgr.Instance.WriteLong(stream, v.dataOffset);
                            // 数量
                            FilePathMgr.Instance.WriteInt(stream, vs.Count);

                            System.Object key2 = subIter.Key;
                            v.WriteKey(key2);
                            while (subIter.MoveNext())
                            {
                                key2 = subIter.Key;
                                v.WriteKey(key2);
                            }
                        }
                        subIter.DisposeIter();
                    }
                }
                iter.DisposeIter();
            }
            else if (valueType == ConfigValueType.cvObject)
            {
                iter = values.GetEnumerator();
                while (iter.MoveNext())
                {
                    System.Object key = iter.Key;
                    IConfigBase   v   = iter.Value as IConfigBase;
                    v.WriteKey(key);
                    FilePathMgr.Instance.WriteLong(stream, v.dataOffset);
                }
                iter.DisposeIter();
            }

            // 重写Header
            header.indexOffset = indexOffset;
            header.SeekFileToHeader(stream);
            header.SaveToStream(stream);

            return(true);
        }