Skip to content

Compress Model XML, Stage 3: assign [MetatdataExtension].Value = null to get rid of Uncompressed XML #333

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Jan 30, 2025
Merged
15 changes: 13 additions & 2 deletions Orm/Xtensive.Orm/Core/SimpleXmlSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/// <summary>
/// Serializes value of <typeparamref name="T"/> to string.
/// </summary>
Expand All @@ -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);
}
}
}
20 changes: 5 additions & 15 deletions Orm/Xtensive.Orm/Orm/Model/Stored/StoredDomainModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we can deserialize here from stream as well? To get rid of intermediate string

Copy link
Collaborator Author

@SergeiPavlov SergeiPavlov Jan 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code will not be active anyway.
0-method means "Non-compressed", not used.

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);
}
Expand All @@ -73,17 +68,12 @@ public static StoredDomainModel Deserialize(string serialized, byte[] data)
/// <returns>Serialized instance.</returns>
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());
}

/// <summary>
Expand Down
4 changes: 2 additions & 2 deletions Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,8 @@ private Dictionary<string, MetadataSet> 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);
Expand Down
2 changes: 1 addition & 1 deletion Version.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<DoVersion>7.2.167</DoVersion>
<DoVersion>7.2.168</DoVersion>
<DoVersionSuffix>servicetitan</DoVersionSuffix>
</PropertyGroup>

Expand Down