Skip to content

Commit 09b311c

Browse files
committed
Add cloning via DataContractSerializer and apply where it was already used
1 parent b25736f commit 09b311c

File tree

5 files changed

+33
-32
lines changed

5 files changed

+33
-32
lines changed

Orm/Xtensive.Orm.Tests.Framework/Cloner.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,25 @@ public static T CloneViaBinarySerialization<T>(T source)
2929
return (T) Formatter.Deserialize(stream);
3030
}
3131
}
32+
33+
public static T CloneViaDataContractSerializer<T>(T source, IEnumerable<Type> knownTypes)
34+
{
35+
using (var mStream = new MemoryStream()) {
36+
var dcSerializer = new DataContractSerializer(typeof(T), knownTypes);
37+
dcSerializer.WriteObject(mStream, source);
38+
_ = mStream.Seek(0, SeekOrigin.Begin);
39+
return (T) dcSerializer.ReadObject(mStream);
40+
}
41+
}
42+
43+
public static T CloneViaDataContractSerializer<T>(T source, DataContractSerializerSettings settings)
44+
{
45+
using (var mStream = new MemoryStream()) {
46+
var dcSerializer = new DataContractSerializer(typeof(T), settings);
47+
dcSerializer.WriteObject(mStream, source);
48+
_ = mStream.Seek(0, SeekOrigin.Begin);
49+
return (T) dcSerializer.ReadObject(mStream);
50+
}
51+
}
3252
}
3353
}

Orm/Xtensive.Orm.Tests.Sql/MySQL/MiscTests.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2010 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2011-2025 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Malisa Ncube
55
// Created: 2011.03.17
66

@@ -68,14 +68,11 @@ public void ArrayTest()//TODO: Find reason why this pattern is structured like t
6868
SqlSelect select = SqlDml.Select();
6969
select.Where = SqlDml.In(1, i);
7070

71-
using (var mStream = new MemoryStream()) {
72-
var dcSerializer = new DataContractSerializer(typeof(SqlSelect), [typeof(SqlLiteral<int>), typeof(SqlBinary), typeof(SqlNative), typeof(SqlArray<int>)]);
73-
dcSerializer.WriteObject(mStream, select);
74-
_ = mStream.Seek(0, SeekOrigin.Begin);
75-
select = (SqlSelect) dcSerializer.ReadObject(mStream);
76-
}
71+
var cloned = Cloner.CloneViaDataContractSerializer(select, [typeof(SqlLiteral<int>), typeof(SqlBinary), typeof(SqlNative), typeof(SqlArray<int>)]);
7772

7873
Console.WriteLine(SqlDriver.Compile(select).GetCommandText());
74+
Console.WriteLine(SqlDriver.Compile(cloned).GetCommandText());
75+
7976
}
8077

8178
[Test]

Orm/Xtensive.Orm.Tests.Sql/SqlServer/MiscTests.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,10 @@ public void ArrayTest()
7272
SqlSelect select = SqlDml.Select();
7373
select.Where = SqlDml.In(1, i);
7474

75-
using(var mStream = new MemoryStream()) {
76-
var dcSerializer = new DataContractSerializer(typeof(SqlSelect), [typeof(SqlLiteral<int>), typeof(SqlBinary), typeof(SqlNative), typeof(SqlArray<int>)]);
77-
dcSerializer.WriteObject(mStream, select);
78-
_ = mStream.Seek(0, SeekOrigin.Begin);
79-
select = (SqlSelect) dcSerializer.ReadObject(mStream);
80-
}
75+
var cloned = Cloner.CloneViaDataContractSerializer(select, [typeof(SqlLiteral<int>), typeof(SqlBinary), typeof(SqlNative), typeof(SqlArray<int>)]);
8176

8277
Console.WriteLine(sqlDriver.Compile(select).GetCommandText());
78+
Console.WriteLine(sqlDriver.Compile(cloned).GetCommandText());
8379
}
8480

8581
[Test]

Orm/Xtensive.Orm.Tests.Sql/Sqlite/MiscTests.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,10 @@ public void ArrayTest() //TODO: Find reason why this pattern is structured like
125125
SqlSelect select = SqlDml.Select();
126126
select.Where = SqlDml.In(1, i);
127127

128-
using(var mStream = new MemoryStream()) {
129-
var dcSerializer = new DataContractSerializer(typeof(SqlSelect), [typeof(SqlLiteral<int>), typeof(SqlBinary), typeof(SqlNative), typeof(SqlArray<int>)]);
130-
dcSerializer.WriteObject(mStream, select);
131-
_ = mStream.Seek(0, SeekOrigin.Begin);
132-
select = (SqlSelect) dcSerializer.ReadObject(mStream);
133-
}
128+
var cloned = Cloner.CloneViaDataContractSerializer(select, [typeof(SqlLiteral<int>), typeof(SqlBinary), typeof(SqlNative), typeof(SqlArray<int>)]);
134129

135130
Console.WriteLine(sqlDriver.Compile(select).GetCommandText());
131+
Console.WriteLine(sqlDriver.Compile(cloned).GetCommandText());
136132
}
137133

138134
[Test]

Orm/Xtensive.Orm.Tests/Issues/Issue0808_StructSerialization.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,10 @@ public void MainTest()
5151
var t = typeof(UnifiedCustomerID);
5252
Expression<Func<int, UnifiedCustomerID>> ex = a => new UnifiedCustomerID { Id = 2 };
5353
var serializableExpression = ex.ToSerializableExpression();
54-
using (var memoryStream = new MemoryStream()) {
55-
var serializer = new DataContractSerializer(typeof(SerializableLambdaExpression),
56-
SerializableExpressionTypes.Except(Enumerable.Repeat(typeof(SerializableLambdaExpression), 1)));
54+
var deserializedExpression = (SerializableLambdaExpression) Cloner.CloneViaDataContractSerializer(serializableExpression,
55+
SerializableExpressionTypes.Except(Enumerable.Repeat(typeof(SerializableLambdaExpression), 1)));
5756

58-
serializer.WriteObject(memoryStream, serializableExpression);
59-
60-
memoryStream.Position = 0;
61-
62-
var deserializedExpression = (SerializableLambdaExpression) serializer.ReadObject(memoryStream);
63-
64-
var ex2 = deserializedExpression.ToExpression();
65-
}
57+
var ex2 = deserializedExpression.ToExpression();
6658
}
6759
}
6860
}

0 commit comments

Comments
 (0)