Browse Source

Added compatibility for old serialization

Krzysztof Krysiński 3 months ago
parent
commit
9425e32754

+ 13 - 0
src/PixiEditor/Models/Serialization/Factories/ByteExtractor.cs

@@ -109,4 +109,17 @@ public class ByteExtractor
         
         
         return value;
         return value;
     }
     }
+
+    internal string GetStringLegacyDontUse()
+    {
+        int length = GetInt();
+
+        StringBuilder sb = new StringBuilder(length);
+        for (int i = 0; i < length; i++)
+        {
+            sb.Append((char)GetInt());
+        }
+
+        return sb.ToString();
+    }
 }
 }

+ 3 - 1
src/PixiEditor/Models/Serialization/Factories/FontFamilySerializationFactory.cs

@@ -36,7 +36,9 @@ public class FontFamilySerializationFactory : SerializationFactory<byte[], FontF
         }
         }
 
 
         ByteExtractor extractor = new ByteExtractor(bytes);
         ByteExtractor extractor = new ByteExtractor(bytes);
-        string fontFamily = extractor.GetString();
+
+        string fontFamily = DeserializeStringCompatible(extractor, serializerData);
+
         bool isFontFromFile = extractor.GetBool();
         bool isFontFromFile = extractor.GetBool();
         string fontPath = null;
         string fontPath = null;
         if (isFontFromFile && ResourceLocator != null)
         if (isFontFromFile && ResourceLocator != null)

+ 17 - 0
src/PixiEditor/Models/Serialization/Factories/SerializationFactory.cs

@@ -65,6 +65,23 @@ public abstract class SerializationFactory<TSerializable, TOriginal> : Serializa
     {
     {
         return TryDeserialize(rawData, out TOriginal original, serializerData) ? original : default;
         return TryDeserialize(rawData, out TOriginal original, serializerData) ? original : default;
     }
     }
+
+    protected string DeserializeStringCompatible(
+        ByteExtractor extractor,
+        (string serializerName, string serializerVersion) serializerData)
+    {
+        if (serializerData.serializerName != "PixiEditor")
+        {
+            return extractor.GetString();
+        }
+
+        if (IsFilePreVersion(serializerData, new Version(2, 0, 0, 87)))
+        {
+            return extractor.GetStringLegacyDontUse();
+        }
+
+        return extractor.GetString();
+    }
     
     
     public override Type OriginalType => typeof(TOriginal);
     public override Type OriginalType => typeof(TOriginal);
 }
 }

+ 4 - 3
src/PixiEditor/Models/Serialization/Factories/TextSerializationFactory.cs

@@ -46,10 +46,11 @@ internal class TextSerializationFactory : VectorShapeSerializationFactory<TextVe
         float strokeWidth, (string serializerName, string serializerVersion) serializerData,
         float strokeWidth, (string serializerName, string serializerVersion) serializerData,
         out TextVectorData original)
         out TextVectorData original)
     {
     {
-        string text = extractor.GetString();
+        string text = DeserializeStringCompatible(extractor, serializerData);
+
         VecD position = extractor.GetVecD();
         VecD position = extractor.GetVecD();
         bool antiAlias = extractor.GetBool();
         bool antiAlias = extractor.GetBool();
-        string fontFamily = extractor.GetString();
+        string fontFamily = DeserializeStringCompatible(extractor, serializerData);
         bool isFontFromFile = extractor.GetBool();
         bool isFontFromFile = extractor.GetBool();
         string fontPath = null;
         string fontPath = null;
         if (isFontFromFile && ResourceLocator != null)
         if (isFontFromFile && ResourceLocator != null)
@@ -67,7 +68,7 @@ internal class TextSerializationFactory : VectorShapeSerializationFactory<TextVe
         VectorPath path = null;
         VectorPath path = null;
         if (hasPath)
         if (hasPath)
         {
         {
-            path = VectorPath.FromSvgPath(extractor.GetString());
+            path = VectorPath.FromSvgPath(DeserializeStringCompatible(extractor, serializerData));
         }
         }
 
 
         FontFamilyName family =
         FontFamilyName family =

+ 1 - 1
src/PixiEditor/Models/Serialization/Factories/VectorPathSerializationFactory.cs

@@ -51,7 +51,7 @@ internal class VectorPathSerializationFactory : VectorShapeSerializationFactory<
         VectorPath path;
         VectorPath path;
         if (IsOldSerializer(serializerData))
         if (IsOldSerializer(serializerData))
         {
         {
-            string svgPath = extractor.GetString();
+            string svgPath = extractor.GetStringLegacyDontUse();
             path = VectorPath.FromSvgPath(svgPath);
             path = VectorPath.FromSvgPath(svgPath);
         }
         }
         else
         else

+ 8 - 5
src/PixiEditor/Models/Serialization/Factories/VectorShapeSerializationFactory.cs

@@ -20,7 +20,8 @@ public abstract class VectorShapeSerializationFactory<T> : SerializationFactory<
 
 
         foreach (Type type in types)
         foreach (Type type in types)
         {
         {
-            if (type.IsAssignableTo(typeof(IPaintableSerializationFactory)) && type is { IsAbstract: false, IsInterface: false })
+            if (type.IsAssignableTo(typeof(IPaintableSerializationFactory)) &&
+                type is { IsAbstract: false, IsInterface: false })
             {
             {
                 factories.Add((SerializationFactory)Activator.CreateInstance(type));
                 factories.Add((SerializationFactory)Activator.CreateInstance(type));
             }
             }
@@ -61,9 +62,9 @@ public abstract class VectorShapeSerializationFactory<T> : SerializationFactory<
         ByteExtractor extractor = new ByteExtractor(data);
         ByteExtractor extractor = new ByteExtractor(data);
 
 
         Matrix3X3 matrix = extractor.GetMatrix3X3();
         Matrix3X3 matrix = extractor.GetMatrix3X3();
-        Paintable strokeColor = TryGetPaintable(extractor, fileIsPrePaintables);
+        Paintable strokeColor = TryGetPaintable(extractor, fileIsPrePaintables, serializerData);
         bool fill = TryGetBool(extractor, serializerData);
         bool fill = TryGetBool(extractor, serializerData);
-        Paintable fillColor = TryGetPaintable(extractor, fileIsPrePaintables);
+        Paintable fillColor = TryGetPaintable(extractor, fileIsPrePaintables, serializerData);
         float strokeWidth;
         float strokeWidth;
         // Previous versions of the serializer saved stroke as int, and serializer data didn't exist
         // Previous versions of the serializer saved stroke as int, and serializer data didn't exist
         if (string.IsNullOrEmpty(serializerData.serializerVersion) &&
         if (string.IsNullOrEmpty(serializerData.serializerVersion) &&
@@ -100,14 +101,16 @@ public abstract class VectorShapeSerializationFactory<T> : SerializationFactory<
         return extractor.GetBool();
         return extractor.GetBool();
     }
     }
 
 
-    private Paintable TryGetPaintable(ByteExtractor extractor, bool fileIsPrePaintables)
+    private Paintable TryGetPaintable(ByteExtractor extractor, bool fileIsPrePaintables,
+        (string serializerName, string serializerVersion) serializerData)
     {
     {
         if (fileIsPrePaintables)
         if (fileIsPrePaintables)
         {
         {
             return new ColorPaintable(extractor.GetColor());
             return new ColorPaintable(extractor.GetColor());
         }
         }
 
 
-        string paintableType = extractor.GetString();
+        string paintableType = DeserializeStringCompatible(extractor, serializerData);
+
         SerializationFactory factory = PaintableFactories.FirstOrDefault(f => f.DeserializationId == paintableType);
         SerializationFactory factory = PaintableFactories.FirstOrDefault(f => f.DeserializationId == paintableType);
         if (factory == null)
         if (factory == null)
         {
         {