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); }
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); }