Changeset 3005
- Timestamp:
- 03/11/10 15:50:50 (15 years ago)
- Location:
- trunk/sources/HeuristicLab.Persistence/3.3
- Files:
-
- 1 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Persistence/3.3/Core/DeSerializer.cs
r3004 r3005 77 77 parentStack = new Stack<Midwife>(); 78 78 typeIds = new Dictionary<int, Type>(); 79 serializerMapping = CreateSerializers(typeCache); 80 } 81 82 private Dictionary<Type, object> CreateSerializers(IEnumerable<TypeMapping> typeCache) { 83 Dictionary<Type, object> serializerInstances = new Dictionary<Type, object>(); 79 serializerMapping = new Dictionary<Type, object>(); 80 foreach (var typeMapping in typeCache) { 81 AddTypeInfo(typeMapping); 82 } 83 } 84 85 private Dictionary<Type, object> serializerInstances = new Dictionary<Type, object>(); 86 87 public void AddTypeInfo(TypeMapping typeMapping) { 88 if (typeIds.ContainsKey(typeMapping.Id)) 89 return; 84 90 try { 85 var map = new Dictionary<Type, object>(); 86 foreach (var typeMapping in typeCache) { 87 Type type = TypeLoader.Load(typeMapping.TypeName); 88 typeIds.Add(typeMapping.Id, type); 89 Type serializerType = TypeLoader.Load(typeMapping.Serializer); 90 object serializer; 91 if (serializerInstances.ContainsKey(serializerType)) 92 serializer = serializerInstances[serializerType]; 93 else 94 serializer = Activator.CreateInstance(serializerType, true); 95 map.Add(type, serializer); 96 } 97 return map; 91 Type type = TypeLoader.Load(typeMapping.TypeName); 92 typeIds.Add(typeMapping.Id, type); 93 Type serializerType = TypeLoader.Load(typeMapping.Serializer); 94 object serializer; 95 if (serializerInstances.ContainsKey(serializerType)) 96 serializer = serializerInstances[serializerType]; 97 else 98 serializer = Activator.CreateInstance(serializerType, true); 99 serializerMapping.Add(type, serializer); 98 100 } catch (PersistenceException) { 99 101 throw; 100 102 } catch (Exception e) { 101 throw new PersistenceException( 102 " The serialization type cache could not be loaded.\r\n" +103 "This usualy happens when you are missing an Assembly or Plugin.", e);103 throw new PersistenceException(string.Format( 104 "Could not add type info for {0} ({1})", 105 typeMapping.TypeName, typeMapping.Serializer), e); 104 106 } 105 107 } … … 125 127 } else if (t == typeof(MetaInfoEndToken)) { 126 128 MetaInfoEnd((MetaInfoEndToken)token); 129 } else if (t == typeof(TypeToken)) { 130 Type((TypeToken)token); 127 131 } else { 128 132 throw new PersistenceException("invalid token type"); … … 138 142 if (!m.MetaMode && m.Obj == null) 139 143 CreateInstance(m); 144 } 145 146 private void Type(TypeToken token) { 147 AddTypeInfo(new TypeMapping(token.Id, token.TypeName, token.Serializer)); 140 148 } 141 149 -
trunk/sources/HeuristicLab.Persistence/3.3/Core/GeneratorBase.cs
r3004 r3005 34 34 if (type == typeof(MetaInfoEndToken)) 35 35 return Format((MetaInfoEndToken)token); 36 if (type == typeof(TypeToken)) 37 return Format((TypeToken)token); 36 38 throw new ApplicationException("Invalid token of type " + type.FullName); 37 39 } … … 44 46 protected abstract T Format(MetaInfoBeginToken metaInfoBeginToken); 45 47 protected abstract T Format(MetaInfoEndToken metaInfoEndToken); 48 protected abstract T Format(TypeToken typeToken); 46 49 47 50 } -
trunk/sources/HeuristicLab.Persistence/3.3/Core/Serializer.cs
r3004 r3005 49 49 private readonly bool isTestRun; 50 50 private readonly List<Exception> exceptions; 51 52 public bool InterleaveTypeInformation { get; set; } 51 53 52 54 /// <summary> … … 106 108 /// don't stop at the first exception</param> 107 109 public Serializer(object obj, Configuration configuration, string rootName, bool isTestRun) { 110 this.InterleaveTypeInformation = false; 108 111 this.obj = obj; 109 112 this.rootName = rootName; … … 144 147 if (obj2id.ContainsKey(value)) 145 148 return ReferenceEnumerator(accessor.Name, obj2id[value]); 146 if (!typeCache.ContainsKey(type)) 149 bool emitTypeInfo = false; 150 if (!typeCache.ContainsKey(type)) { 147 151 typeCache.Add(type, typeCache.Count); 152 emitTypeInfo = InterleaveTypeInformation; 153 } 148 154 int typeId = typeCache[type]; 149 155 int? id = null; … … 155 161 IPrimitiveSerializer primitiveSerializer = configuration.GetPrimitiveSerializer(type); 156 162 if (primitiveSerializer != null) 157 return PrimitiveEnumerator(accessor.Name, typeId, primitiveSerializer.Format(value), id); 163 return PrimitiveEnumerator( 164 accessor.Name, 165 typeId, 166 primitiveSerializer.Format(value), 167 id, 168 emitTypeInfo); 158 169 ICompositeSerializer compositeSerializer = configuration.GetCompositeSerializer(type); 159 170 if (compositeSerializer != null) 160 return CompositeEnumerator(accessor.Name, compositeSerializer.Decompose(value), id, typeId, compositeSerializer.CreateMetaInfo(value)); 171 return CompositeEnumerator( 172 accessor.Name, 173 compositeSerializer.Decompose(value), 174 id, 175 typeId, 176 compositeSerializer.CreateMetaInfo(value), 177 emitTypeInfo); 161 178 throw CreatePersistenceException(type); 162 179 } catch (Exception x) { … … 200 217 201 218 private IEnumerator<ISerializationToken> PrimitiveEnumerator(string name, 202 int typeId, ISerialData serializedValue, int? id) { 219 int typeId, ISerialData serializedValue, int? id, bool emitTypeInfo) { 220 if (emitTypeInfo) { 221 var mapping = TypeCache[typeId]; 222 yield return new TypeToken(mapping.Id, mapping.TypeName, mapping.Serializer); 223 } 203 224 yield return new PrimitiveToken(name, typeId, id, serializedValue); 204 225 } 205 226 206 227 private IEnumerator<ISerializationToken> CompositeEnumerator( 207 string name, IEnumerable<Tag> tags, int? id, int typeId, IEnumerable<Tag> metaInfo) { 228 string name, IEnumerable<Tag> tags, int? id, int typeId, IEnumerable<Tag> metaInfo, 229 bool emitTypeInfo) { 230 if (emitTypeInfo) { 231 var mapping = TypeCache[typeId]; 232 yield return new TypeToken(mapping.Id, mapping.TypeName, mapping.Serializer); 233 } 208 234 yield return new BeginToken(name, typeId, id); 209 235 bool first = true; -
trunk/sources/HeuristicLab.Persistence/3.3/Default/DebugString/DebugStringGenerator.cs
r1612 r3005 97 97 } 98 98 99 protected override string Format(TypeToken typeToken) { 100 return string.Empty; 101 } 102 99 103 public static string Serialize(object o) { 100 104 return Serialize(o, ConfigurationService.Instance.GetDefaultConfig(new DebugStringFormat())); -
trunk/sources/HeuristicLab.Persistence/3.3/Default/Xml/XmlGenerator.cs
r3004 r3005 8 8 using HeuristicLab.Tracing; 9 9 using HeuristicLab.Persistence.Core.Tokens; 10 using System.IO.Compression; 10 11 11 12 namespace HeuristicLab.Persistence.Default.Xml { … … 109 110 110 111 protected override string Format(BeginToken beginToken) { 111 return CreateNodeStart( 112 XmlStringConstants.COMPOSITE, 113 new Dictionary<string, object> { 112 var dict = new Dictionary<string, object> { 114 113 {"name", beginToken.Name}, 115 114 {"typeId", beginToken.TypeId}, 116 {"id", beginToken.Id}}); 115 {"id", beginToken.Id}}; 116 AddTypeInfo(beginToken.TypeId, dict); 117 return CreateNodeStart(XmlStringConstants.COMPOSITE, dict); 118 119 } 120 121 private void AddTypeInfo(int typeId, Dictionary<string, object> dict) { 122 if (lastTypeToken != null) { 123 if (typeId == lastTypeToken.Id) { 124 dict.Add("typeName", lastTypeToken.TypeName); 125 dict.Add("serializer", lastTypeToken.Serializer); 126 lastTypeToken = null; 127 } else { 128 FlushTypeToken(); 129 } 130 } 117 131 } 118 132 … … 122 136 123 137 protected override string Format(PrimitiveToken dataToken) { 124 return CreateNode(XmlStringConstants.PRIMITIVE, 125 new Dictionary<string, object> { 138 var dict = new Dictionary<string, object> { 126 139 {"typeId", dataToken.TypeId}, 127 140 {"name", dataToken.Name}, 128 {"id", dataToken.Id}}, 141 {"id", dataToken.Id}}; 142 AddTypeInfo(dataToken.TypeId, dict); 143 return CreateNode(XmlStringConstants.PRIMITIVE, dict, 129 144 ((XmlString)dataToken.SerialData).Data); 130 145 } … … 149 164 protected override string Format(MetaInfoEndToken metaInfoEndToken) { 150 165 return CreateNodeEnd(XmlStringConstants.METAINFO); 166 } 167 168 private TypeToken lastTypeToken; 169 protected override string Format(TypeToken token) { 170 lastTypeToken = token; 171 return ""; 172 } 173 174 private string FlushTypeToken() { 175 if (lastTypeToken == null) 176 return ""; 177 try { 178 return CreateNode(XmlStringConstants.TYPE, 179 new Dictionary<string, object> { 180 {"id", lastTypeToken.Id}, 181 {"typeName", lastTypeToken.TypeName }, 182 {"serializer", lastTypeToken.Serializer }}); 183 } finally { 184 lastTypeToken = null; 185 } 151 186 } 152 187 … … 182 217 } 183 218 184 185 219 public static void Serialize(object obj, string filename, Configuration config) { 186 220 Serialize(obj, filename, config, false, 5); … … 192 226 DateTime start = DateTime.Now; 193 227 using (FileStream stream = File.Create(tempfile)) { 194 Serialize(obj, stream, config, includeAssemblies, compression); 228 Serializer serializer = new Serializer(obj, config); 229 serializer.InterleaveTypeInformation = false; 230 XmlGenerator generator = new XmlGenerator(); 231 using (ZipOutputStream zipStream = new ZipOutputStream(stream)) { 232 zipStream.IsStreamOwner = false; 233 zipStream.SetLevel(compression); 234 zipStream.PutNextEntry(new ZipEntry("data.xml") { DateTime = DateTime.MinValue }); 235 StreamWriter writer = new StreamWriter(zipStream); 236 foreach (ISerializationToken token in serializer) { 237 string line = generator.Format(token); 238 writer.Write(line); 239 } 240 writer.Flush(); 241 zipStream.PutNextEntry(new ZipEntry("typecache.xml") { DateTime = DateTime.MinValue }); 242 foreach (string line in generator.Format(serializer.TypeCache)) { 243 writer.Write(line); 244 } 245 writer.Flush(); 246 if (includeAssemblies) { 247 foreach (string name in serializer.RequiredFiles) { 248 Uri uri = new Uri(name); 249 if (!uri.IsFile) { 250 Logger.Warn("cannot read non-local files"); 251 continue; 252 } 253 zipStream.PutNextEntry(new ZipEntry(Path.GetFileName(uri.PathAndQuery))); 254 FileStream reader = File.OpenRead(uri.PathAndQuery); 255 byte[] buffer = new byte[1024 * 1024]; 256 while (true) { 257 int bytesRead = reader.Read(buffer, 0, 1024 * 1024); 258 if (bytesRead == 0) 259 break; 260 zipStream.Write(buffer, 0, bytesRead); 261 } 262 writer.Flush(); 263 } 264 } 265 } 195 266 } 196 267 Logger.Info(String.Format("serialization took {0} seconds with compression level {1}", … … 204 275 } 205 276 277 public static void Serialize(object obj, Stream stream) { 278 Serialize(obj, stream, ConfigurationService.Instance.GetConfiguration(new XmlFormat())); 279 } 280 206 281 207 282 public static void Serialize(object obj, Stream stream, Configuration config) { 208 283 Serialize(obj, stream, config, false); 209 284 } 210 285 211 286 public static void Serialize(object obj, Stream stream, Configuration config, bool includeAssemblies) { 212 Serialize(obj, stream, config, includeAssemblies, 9);213 } 214 215 public static void Serialize(object obj, Stream stream, Configuration config, bool includeAssemblies, int compression) {287 Serialize(obj, stream, config, includeAssemblies, true); 288 } 289 290 public static void Serialize(object obj, Stream stream, Configuration config, bool includeAssemblies, bool interleaveTypeInfo) { 216 291 try { 217 Serializer serializer = new Serializer(obj, config); 218 XmlGenerator generator = new XmlGenerator(); 219 using (ZipOutputStream zipStream = new ZipOutputStream(stream)) { 220 zipStream.IsStreamOwner = false; 221 zipStream.SetLevel(compression); 222 zipStream.PutNextEntry(new ZipEntry("data.xml") { DateTime = DateTime.MinValue }); 223 StreamWriter writer = new StreamWriter(zipStream); 292 using (StreamWriter writer = new StreamWriter(new GZipStream(stream, CompressionMode.Compress))) { 293 Serializer serializer = new Serializer(obj, config); 294 serializer.InterleaveTypeInformation = true; 295 XmlGenerator generator = new XmlGenerator(); 224 296 foreach (ISerializationToken token in serializer) { 225 297 string line = generator.Format(token); … … 227 299 } 228 300 writer.Flush(); 229 zipStream.PutNextEntry(new ZipEntry("typecache.xml") { DateTime = DateTime.MinValue });230 foreach (string line in generator.Format(serializer.TypeCache)) {231 writer.Write(line);232 }233 writer.Flush();234 if (includeAssemblies) {235 foreach (string name in serializer.RequiredFiles) {236 Uri uri = new Uri(name);237 if (!uri.IsFile) {238 Logger.Warn("cannot read non-local files");239 continue;240 }241 zipStream.PutNextEntry(new ZipEntry(Path.GetFileName(uri.PathAndQuery)));242 FileStream reader = File.OpenRead(uri.PathAndQuery);243 byte[] buffer = new byte[1024 * 1024];244 while (true) {245 int bytesRead = reader.Read(buffer, 0, 1024 * 1024);246 if (bytesRead == 0)247 break;248 zipStream.Write(buffer, 0, bytesRead);249 }250 writer.Flush();251 }252 }253 301 } 254 302 } catch (PersistenceException) { … … 256 304 } catch (Exception e) { 257 305 throw new PersistenceException("Unexpected exception during Serialization.", e); 258 } 306 } 259 307 } 260 308 } -
trunk/sources/HeuristicLab.Persistence/3.3/Default/Xml/XmlParser.cs
r2874 r3005 8 8 using ICSharpCode.SharpZipLib.Zip; 9 9 using HeuristicLab.Persistence.Core.Tokens; 10 using System.IO.Compression; 10 11 11 12 namespace HeuristicLab.Persistence.Default.Xml { … … 30 31 {XmlStringConstants.NULL, ParseNull}, 31 32 {XmlStringConstants.METAINFO, ParseMetaInfo}, 33 {XmlStringConstants.TYPE, ParseTypeInfo}, 32 34 }; 33 35 } … … 59 61 string name = reader.GetAttribute("name"); 60 62 int typeId = int.Parse(reader.GetAttribute("typeId")); 63 string typeName = reader.GetAttribute("typeName"); 64 string serializer = reader.GetAttribute("serializer"); 65 if (typeName != null) 66 yield return new TypeToken(typeId, typeName, serializer); 61 67 XmlReader inner = reader.ReadSubtree(); 62 68 inner.Read(); … … 73 79 id = int.Parse(idString); 74 80 int typeId = int.Parse(reader.GetAttribute("typeId")); 81 string typeName = reader.GetAttribute("typeName"); 82 string serializer = reader.GetAttribute("serializer"); 83 if (typeName != null) 84 yield return new TypeToken(typeId, typeName, serializer); 75 85 yield return new BeginToken(name, typeId, id); 76 86 IEnumerator<ISerializationToken> iterator = GetEnumerator(); … … 96 106 yield return iterator.Current; 97 107 yield return new MetaInfoEndToken(); 108 } 109 110 private IEnumerator<ISerializationToken> ParseTypeInfo() { 111 yield return new TypeToken( 112 int.Parse(reader.GetAttribute("id")), 113 reader.GetAttribute("typeName"), 114 reader.GetAttribute("serializer")); 98 115 } 99 116 … … 129 146 130 147 public static object Deserialize(Stream stream) { 131 using (ZipFile file = new ZipFile(stream)) { 132 return Deserialize(file); 148 try { 149 using (StreamReader reader = new StreamReader(new GZipStream(stream, CompressionMode.Decompress))) { 150 XmlParser parser = new XmlParser(reader); 151 Deserializer deserializer = new Deserializer(new TypeMapping[] { }); 152 return deserializer.Deserialize(parser); 153 } 154 } catch (PersistenceException) { 155 throw; 156 } catch (Exception x) { 157 throw new PersistenceException("Unexpected exception during deserialization", x); 133 158 } 134 159 } … … 136 161 private static object Deserialize(ZipFile zipFile) { 137 162 try { 138 Deserializer deSerializer = new Deserializer( 139 ParseTypeCache( 140 new StreamReader( 141 zipFile.GetInputStream(zipFile.GetEntry("typecache.xml"))))); 163 ZipEntry typecache = zipFile.GetEntry("typecache.xml"); 164 if (typecache == null) 165 throw new PersistenceException("file does not contain typecache.xml"); 166 Deserializer deSerializer = new Deserializer(ParseTypeCache(new StreamReader(zipFile.GetInputStream(typecache)))); 167 ZipEntry data = zipFile.GetEntry("data.xml"); 168 if (data == null) 169 throw new PersistenceException("file does not contain data.xml"); 142 170 XmlParser parser = new XmlParser( 143 new StreamReader(zipFile.GetInputStream( zipFile.GetEntry("data.xml"))));171 new StreamReader(zipFile.GetInputStream(data))); 144 172 object result = deSerializer.Deserialize(parser); 145 173 zipFile.Close(); 146 174 return result; 147 } catch (PersistenceException e) {175 } catch (PersistenceException) { 148 176 throw; 149 177 } catch (Exception e) { -
trunk/sources/HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj
r2994 r3005 106 106 <Compile Include="Core\FormatBase.cs" /> 107 107 <Compile Include="Auxiliary\TypeExtensions.cs" /> 108 <Compile Include="Core\Tokens\TypeToken.cs" /> 108 109 <Compile Include="Core\TypeMapping.cs" /> 109 110 <Compile Include="Auxiliary\TypeName.cs" /> -
trunk/sources/HeuristicLab.Persistence/3.3/Tests/UseCases.cs
r2994 r3005 199 199 [TestMethod] 200 200 public void ComplexStorable() { 201 Root r = new Root(); 202 r.intStack.Push(1); 203 r.intStack.Push(2); 204 r.intStack.Push(3); 205 r.selfReferences = new List<Root> { r, r }; 206 r.c = new Custom { r = r }; 207 r.dict.Add("one", 1); 208 r.dict.Add("two", 2); 209 r.dict.Add("three", 3); 210 r.myEnum = TestEnum.va1; 211 r.i = new[] { 7, 5, 6 }; 212 r.s = "new value"; 213 r.intArray = new ArrayList { 3, 2, 1 }; 214 r.intList = new List<int> { 9, 8, 7 }; 215 r.multiDimArray = new double[,] { { 5, 4, 3 }, { 1, 4, 6 } }; 216 r.boolean = false; 217 r.dateTime = DateTime.Now; 218 r.kvp = new KeyValuePair<string, int>("string key", 321); 219 r.uninitialized = null; 201 Root r = InitializeComplexStorable(); 220 202 XmlGenerator.Serialize(r, tempFile); 221 203 Root newR = (Root)XmlParser.Deserialize(tempFile); 204 CompareComplexStorables(r, newR); 205 } 206 207 private static void CompareComplexStorables(Root r, Root newR) { 222 208 Assert.AreEqual( 223 209 DebugStringGenerator.Serialize(r), … … 274 260 } 275 261 262 private static Root InitializeComplexStorable() { 263 Root r = new Root(); 264 r.intStack.Push(1); 265 r.intStack.Push(2); 266 r.intStack.Push(3); 267 r.selfReferences = new List<Root> { r, r }; 268 r.c = new Custom { r = r }; 269 r.dict.Add("one", 1); 270 r.dict.Add("two", 2); 271 r.dict.Add("three", 3); 272 r.myEnum = TestEnum.va1; 273 r.i = new[] { 7, 5, 6 }; 274 r.s = "new value"; 275 r.intArray = new ArrayList { 3, 2, 1 }; 276 r.intList = new List<int> { 9, 8, 7 }; 277 r.multiDimArray = new double[,] { { 5, 4, 3 }, { 1, 4, 6 } }; 278 r.boolean = false; 279 r.dateTime = DateTime.Now; 280 r.kvp = new KeyValuePair<string, int>("string key", 321); 281 r.uninitialized = null; 282 283 return r; 284 } 285 276 286 [TestMethod] 277 287 public void SelfReferences() { … … 762 772 } 763 773 774 [TestMethod] 775 public void TestStreaming() { 776 using (MemoryStream stream = new MemoryStream()) { 777 Root r = InitializeComplexStorable(); 778 XmlGenerator.Serialize(r, stream); 779 using (MemoryStream stream2 = new MemoryStream(stream.ToArray())) { 780 Root newR = (Root)XmlParser.Deserialize(stream2); 781 CompareComplexStorables(r, newR); 782 } 783 } 784 } 785 764 786 [ClassInitialize] 765 787 public static void Initialize(TestContext testContext) {
Note: See TracChangeset
for help on using the changeset viewer.