Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/12/11 10:12:50 (13 years ago)
Author:
epitzer
Message:

#1530 Split type and serializer tokens and include special handling for CachedTypeSerializer (this should also fix #1527)

Location:
branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/DebugString/DebugStringGenerator.cs

    r5445 r6737  
    169169    }
    170170
     171    protected override string Format(SerializerToken serializerToken) {
     172      return string.Empty;
     173    }
     174
    171175    /// <summary>
    172176    /// Serializes the specified object.
  • branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/Xml/EasyXmlGenerator.cs

    r5489 r6737  
    5858    /// <returns>The token in serialized form.</returns>
    5959    protected override string Format(EndToken endToken) {
    60       return CreateNodeEnd(typeCache[endToken.TypeId]);
     60      return CreateNodeEnd("END");
    6161    }
    6262
     
    154154        File.Copy(tempfile, filename, true);
    155155        File.Delete(tempfile);
    156       }
    157       catch (Exception) {
     156      } catch (Exception) {
    158157        Logger.Warn("Exception caught, no data has been written.");
    159158        throw;
     
    190189          writer.Flush();
    191190        }
    192       }
    193       catch (PersistenceException) {
     191      } catch (PersistenceException) {
    194192        throw;
    195       }
    196       catch (Exception e) {
     193      } catch (Exception e) {
    197194        throw new PersistenceException("Unexpected exception during Serialization.", e);
    198195      }
  • branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/Xml/XmlGenerator.cs

    r6211 r6737  
    157157      AddTypeInfo(beginToken.TypeId, dict);
    158158      return CreateNodeStart(XmlStringConstants.COMPOSITE, dict);
    159 
    160159    }
    161160
     
    164163        if (typeId == lastTypeToken.Id) {
    165164          dict.Add("typeName", lastTypeToken.TypeName);
    166           dict.Add("serializer", lastTypeToken.Serializer);
    167165          lastTypeToken = null;
    168166        } else {
    169167          FlushTypeToken();
     168        }
     169      }
     170      if (lastSerializerToken != null) {
     171        if (typeId == lastSerializerToken.Id) {
     172          dict.Add("serializer", lastSerializerToken.Serializer);
     173          lastSerializerToken = null;
     174        } else {
     175          FlushSerializerToken();
    170176        }
    171177      }
     
    238244
    239245    protected TypeToken lastTypeToken;
     246    protected SerializerToken lastSerializerToken;
    240247    /// <summary>
    241248    /// Formats the specified token.
     
    245252    protected override string Format(TypeToken token) {
    246253      lastTypeToken = token;
     254      return "";
     255    }
     256
     257    protected override string Format(SerializerToken token) {
     258      lastSerializerToken = token;
    247259      return "";
    248260    }
     
    255267          new Dictionary<string, string> {
    256268          {"id", lastTypeToken.Id.ToString()},
    257           {"typeName", lastTypeToken.TypeName },
    258           {"serializer", lastTypeToken.Serializer }});
     269          {"typeName", lastTypeToken.TypeName }});
    259270      } finally {
    260271        lastTypeToken = null;
     
    262273    }
    263274
     275    protected string FlushSerializerToken() {
     276      if (lastSerializerToken == null)
     277        return "";
     278      try {
     279        return CreateNode(XmlStringConstants.SERIALIZER,
     280          new Dictionary<string, string> {
     281          {"id", lastSerializerToken.Id.ToString()},
     282          {"serializer", lastSerializerToken.Serializer }});
     283      } finally {
     284        lastTypeToken = null;
     285      }
     286    }
     287
    264288    /// <summary>
    265289    /// Formats the specified type cache.
     
    267291    /// <param name="typeCache">The type cache.</param>
    268292    /// <returns>An enumerable of formatted type cache tags.</returns>
    269     public IEnumerable<string> Format(List<TypeMapping> typeCache) {
     293    public IEnumerable<string> Format(TypeCache typeCache) {
    270294      yield return CreateNodeStart(XmlStringConstants.TYPECACHE);
    271       foreach (var mapping in typeCache)
    272         yield return CreateNode(
    273           XmlStringConstants.TYPE,
    274           mapping.GetDict());
     295      foreach (var type in typeCache.Types) {
     296        int id = typeCache.GetOrCreateId(type);
     297        var dict = new Dictionary<string, string> {
     298          {"id", id.ToString()},
     299          {"typeName", type.AssemblyQualifiedName},
     300        };
     301        Type serializer = typeCache.GetSerializer(id);
     302        if (serializer != null)
     303          dict.Add("serializer", serializer.AssemblyQualifiedName);
     304        yield return CreateNode(XmlStringConstants.TYPE, dict);
     305      }
    275306      yield return CreateNodeEnd(XmlStringConstants.TYPECACHE);
    276307    }
     
    342373            writer.Flush();
    343374            if (includeAssemblies) {
    344               foreach (string name in serializer.RequiredFiles) {
     375              foreach (string name in serializer.GetRequiredFiles()) {
    345376                Uri uri = new Uri(name);
    346377                if (!uri.IsFile) {
  • branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/Xml/XmlParser.cs

    r6211 r6737  
    2626using System.IO.Compression;
    2727using System.Xml;
     28using HeuristicLab.Persistence.Auxiliary;
    2829using HeuristicLab.Persistence.Core;
    2930using HeuristicLab.Persistence.Core.Tokens;
     
    5859                     {XmlStringConstants.METAINFO, ParseMetaInfo},
    5960                     {XmlStringConstants.TYPE, ParseTypeInfo},
     61                     {XmlStringConstants.SERIALIZER, ParseSerializer},
    6062                   };
    6163    }
     
    106108      string serializer = reader.GetAttribute("serializer");
    107109      if (typeName != null)
    108         yield return new TypeToken(typeId, typeName, serializer);
     110        yield return new TypeToken(typeId, typeName);
     111      if (serializer != null)
     112        yield return new SerializerToken(typeId, serializer);
    109113      XmlReader inner = reader.ReadSubtree();
    110114      inner.Read();
     
    124128      string serializer = reader.GetAttribute("serializer");
    125129      if (typeName != null)
    126         yield return new TypeToken(typeId, typeName, serializer);
     130        yield return new TypeToken(typeId, typeName);
     131      if (serializer != null)
     132        yield return new SerializerToken(typeId, serializer);
    127133      yield return new BeginToken(name, typeId, id);
    128134      IEnumerator<ISerializationToken> iterator = GetEnumerator();
    129135      while (iterator.MoveNext())
    130136        yield return iterator.Current;
    131       yield return new EndToken(name, typeId, id);
     137      yield return new EndToken();
    132138    }
    133139
     
    151157
    152158    private IEnumerator<ISerializationToken> ParseTypeInfo() {
    153       yield return new TypeToken(
    154         int.Parse(reader.GetAttribute("id")),
    155         reader.GetAttribute("typeName"),
    156         reader.GetAttribute("serializer"));
     159      int id = int.Parse(reader.GetAttribute("id"));
     160      string typeName = reader.GetAttribute("typeName");
     161      yield return new TypeToken(id, typeName);
     162      string serializer = reader.GetAttribute("serializer");
     163      if (serializer != null)
     164        yield return new SerializerToken(id, serializer);
     165    }
     166
     167    private IEnumerator<ISerializationToken> ParseSerializer() {
     168      int id = int.Parse(reader.GetAttribute("id"));
     169      string serializer = reader.GetAttribute("serializer");
     170      yield return new SerializerToken(id, serializer);
    157171    }
    158172
     
    162176    /// <param name="reader">The reader.</param>
    163177    /// <returns>A list of type mapping entries.</returns>
    164     public static List<TypeMapping> ParseTypeCache(TextReader reader) {
    165       try {
    166         var typeCache = new List<TypeMapping>();
     178    public static ReverseTypeCache ParseTypeCache(TextReader reader) {
     179      ReverseTypeCache typeCache = new ReverseTypeCache();
     180      try {
    167181        XmlReader xmlReader = XmlReader.Create(reader);
    168182        while (xmlReader.Read()) {
    169183          if (xmlReader.Name == XmlStringConstants.TYPE) {
    170             typeCache.Add(new TypeMapping(
     184            int id = int.Parse(xmlReader.GetAttribute("id"));
     185            typeCache.AddType(id, TypeLoader.Load(xmlReader.GetAttribute("typeName")));
     186            string serializer = xmlReader.GetAttribute("serializer");
     187            if (serializer != null)
     188              typeCache.AddSerializer(id, TypeLoader.Load(serializer));
     189          } else if (xmlReader.Name == XmlStringConstants.SERIALIZER) {
     190            typeCache.AddSerializer(
    171191              int.Parse(xmlReader.GetAttribute("id")),
    172               xmlReader.GetAttribute("typeName"),
    173               xmlReader.GetAttribute("serializer")));
     192              TypeLoader.Load(xmlReader.GetAttribute("serializer")));
    174193          }
    175194        }
     
    221240        using (StreamReader reader = new StreamReader(new GZipStream(stream, CompressionMode.Decompress))) {
    222241          XmlParser parser = new XmlParser(reader);
    223           Deserializer deserializer = new Deserializer(new TypeMapping[] { });
     242          Deserializer deserializer = new Deserializer(new ReverseTypeCache());
    224243          return deserializer.Deserialize(new AsyncBuffer<ISerializationToken>(parser));
    225244        }
  • branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/Xml/XmlStringConstants.cs

    r5445 r6737  
    3030    public const string TYPECACHE = "TYPECACHE";
    3131    public const string TYPE = "TYPE";
     32    public const string SERIALIZER = "SERIALIZER";
    3233    public const string METAINFO = "METAINFO";
    3334  }
Note: See TracChangeset for help on using the changeset viewer.