diff --git a/Orm/Xtensive.Orm/Core/SimpleXmlSerializer.cs b/Orm/Xtensive.Orm/Core/SimpleXmlSerializer.cs index 450e91ab2..568160129 100644 --- a/Orm/Xtensive.Orm/Core/SimpleXmlSerializer.cs +++ b/Orm/Xtensive.Orm/Core/SimpleXmlSerializer.cs @@ -34,10 +34,13 @@ public T Deserialize(string value) { ArgumentNullException.ThrowIfNull(value, "serialized"); - using (var reader = new StringReader(value)) - return (T) serializer.Deserialize(reader); + using StringReader reader = new(value); + return (T) serializer.Deserialize(reader); } + public T DeserializeFromStream(Stream stream) => + (T) serializer.Deserialize(stream); + /// /// Serializes value of to string. /// @@ -53,5 +56,13 @@ public string Serialize(T value) } return stringWriter.ToString(); } + + public void SerializeIntoStream(T value, Stream stream) + { + ArgumentNullException.ThrowIfNull(value); + + using var xmlWriter = XmlWriter.Create(stream, WriterSettings); + serializer.Serialize(xmlWriter, value); + } } } diff --git a/Orm/Xtensive.Orm/Orm/Model/Stored/StoredDomainModel.cs b/Orm/Xtensive.Orm/Orm/Model/Stored/StoredDomainModel.cs index 9c17c9700..c8a266c9e 100644 --- a/Orm/Xtensive.Orm/Orm/Model/Stored/StoredDomainModel.cs +++ b/Orm/Xtensive.Orm/Orm/Model/Stored/StoredDomainModel.cs @@ -48,21 +48,16 @@ public sealed class StoredDomainModel public static StoredDomainModel Deserialize(string serialized, byte[] data) { if (data != null) { - string xml; switch (data[0]) { case 0: - xml = Encoding.UTF8.GetString(data, 1, data.Length - 1); - break; + return Serializer.Deserialize(Encoding.UTF8.GetString(data, 1, data.Length - 1)); case 1: using (BrotliStream brotliStream = new(new MemoryStream(data, 1, data.Length - 1), CompressionMode.Decompress)) { - using StreamReader reader = new(brotliStream, Encoding.UTF8); - xml = reader.ReadToEnd(); + return Serializer.DeserializeFromStream(brotliStream); } - break; default: throw new NotSupportedException("Invalid data format"); } - return Serializer.Deserialize(xml); } return Serializer.Deserialize(serialized); } @@ -73,17 +68,12 @@ public static StoredDomainModel Deserialize(string serialized, byte[] data) /// Serialized instance. public (string Xml, byte[] Compressed) Serialize() { - var xml = Serializer.Serialize(this); MemoryStream ms = new(1000); - ms.WriteByte(1); + ms.WriteByte(1); // 1 - means Brotli method using (BrotliStream brotliStream = new(ms, CompressionLevel.Optimal)) { - brotliStream.Write(Encoding.UTF8.GetBytes(xml)); + Serializer.SerializeIntoStream(this, brotliStream); } - - //!!!TODO Uncomment following line to switch to Compressed XML serialization - // return (null, ms.ToArray()); - - return (xml, ms.ToArray()); + return (null, ms.ToArray()); } /// diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs b/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs index 120a8df67..540c84765 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs @@ -200,8 +200,8 @@ private Dictionary BuildMetadata(Domain domain, TypeIdRegis // Since we support storage nodes, stored domain model and real model of a node // must be synchronized. So we must update types' mappings storedModel.UpdateMappings(UpgradeContext.NodeConfiguration); - var (serializedModel, compressed) = storedModel.Serialize(); - var modelExtension = new ExtensionMetadata(WellKnown.DomainModelExtensionName, serializedModel, compressed); + var (_, compressed) = storedModel.Serialize(); + var modelExtension = new ExtensionMetadata(WellKnown.DomainModelExtensionName, null, compressed); var indexesExtension = GetPartialIndexes(domain, types); metadata.Assemblies.AddRange(assemblyMetadata); metadata.Types.AddRange(typeMetadata); diff --git a/Version.props b/Version.props index 4f2cf662b..efc202636 100644 --- a/Version.props +++ b/Version.props @@ -2,7 +2,7 @@ - 7.2.167 + 7.2.168 servicetitan