Changeset 16945


Ignore:
Timestamp:
05/11/19 14:38:47 (2 weeks ago)
Author:
jkarder
Message:

#2520: changed deserialization in PersistenceContentManager

  • added method to check if old persistence can open a file
  • used this method to determine which persistence to use
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/HeuristicLab.Core/3.3/PersistenceContentManager.cs

    r16933 r16945  
    3131
    3232    protected override IStorableContent LoadContent(string filename) {
    33       // first try to load using the new persistence format
     33      bool useOldPersistence = XmlParser.CanOpen(filename);
     34      if (useOldPersistence) return XmlParser.Deserialize<IStorableContent>(filename);
     35
    3436      var ser = new ProtoBufSerializer();
    35       try {
    36         return (IStorableContent)ser.Deserialize(filename, out SerializationInfo info);
    37       } catch (Exception e) {
    38         try {
    39           // try old format if new format fails
    40           return XmlParser.Deserialize<IStorableContent>(filename);
    41         } catch (Exception e2) {
    42           throw new AggregateException($"Cannot open file {filename}", e, e2);
    43         }
    44       }
     37      return (IStorableContent)ser.Deserialize(filename, out SerializationInfo info);
    4538    }
    4639
  • trunk/HeuristicLab.Persistence/3.3/Default/Xml/XmlParser.cs

    r16565 r16945  
    288288      }
    289289    }
     290
     291    /// <summary>
     292    /// Checks if the given file can be opened as <see cref="ZipArchive" />.
     293    /// </summary>
     294    /// <param name="filename">The filename.</param>
     295    /// <returns><see langword="true" /> if the file can be opened as <see cref="ZipArchive" />; otherwise, <see langword="false" />.</returns>
     296    public static bool CanOpen(string filename) {
     297      try {
     298        using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read)) {
     299          using (ZipArchive zip = new ZipArchive(fs)) {
     300            return true;
     301          }
     302        }
     303      } catch (InvalidDataException) {
     304        return false;
     305      }
     306    }
    290307  }
    291308}
Note: See TracChangeset for help on using the changeset viewer.