Skip to content

Commit 356d151

Browse files
authored
Merge pull request #4 from Shuttle/async
Async
2 parents 60e81df + 42a5088 commit 356d151

File tree

13 files changed

+408
-26
lines changed

13 files changed

+408
-26
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ The `DefaultSerializer` makes use of the standard .NET xml serialization functio
1414

1515
``` c#
1616
Stream Serialize(object message);
17+
Task<Stream> SerializeAsync(object message);
1718
```
1819

1920
Returns the message `object` as a `Stream`.
@@ -22,9 +23,10 @@ Returns the message `object` as a `Stream`.
2223

2324
``` c#
2425
object Deserialize(Type type, Stream stream);
26+
Task<object> DeserializeAsync(Type type, Stream stream);
2527
```
2628

27-
Deserializes the `Stream` into an `obejct` of the given type.
29+
Deserializes the `Stream` into an `object` of the given type.
2830

2931
# ISerializerRootType
3032

Shuttle.Core.Serialization.Tests/DefaultSerializerFixture.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.IO;
3+
using System.Threading.Tasks;
34
using NUnit.Framework;
45

56
namespace Shuttle.Core.Serialization.Tests
@@ -23,6 +24,23 @@ public void Should_be_able_to_serialize_and_deserialize_a_simple_type()
2324
Assert.AreEqual(original.Id, ((SimpleSerializerType)serializer.Deserialize(typeof(SimpleSerializerType), stream)).Id);
2425
}
2526

27+
[Test]
28+
public async Task Should_be_able_to_serialize_and_deserialize_a_simple_type_async()
29+
{
30+
var original = new SimpleSerializerType();
31+
var serializer = new DefaultSerializer();
32+
33+
var stream = await serializer.SerializeAsync(original);
34+
35+
var xml = await new StreamReader(stream).ReadToEndAsync();
36+
37+
Assert.IsTrue(xml.Contains(original.Id.ToString()));
38+
39+
stream.Position = 0;
40+
41+
Assert.AreEqual(original.Id, ((SimpleSerializerType)await serializer.DeserializeAsync(typeof(SimpleSerializerType), stream)).Id);
42+
}
43+
2644
[Test]
2745
public void Should_be_able_to_serialize_and_deserialize_a_complex_type()
2846
{
@@ -51,5 +69,34 @@ public void Should_be_able_to_serialize_and_deserialize_a_complex_type()
5169
Assert.AreEqual(some1.Id, ((v1.SomeSerializerType)serializer.Deserialize(typeof(v1.SomeSerializerType), serializer.Serialize(some1))).Id);
5270
Assert.AreEqual(some2.Id, ((v2.SomeSerializerType)serializer.Deserialize(typeof(v2.SomeSerializerType), serializer.Serialize(some2))).Id);
5371
}
72+
73+
[Test]
74+
public async Task Should_be_able_to_serialize_and_deserialize_a_complex_type_async()
75+
{
76+
var complex = new ComplexSerializerType();
77+
var serializer = new DefaultSerializer();
78+
79+
serializer.AddSerializerType(typeof(ComplexSerializerType), typeof(v1.SomeSerializerType));
80+
serializer.AddSerializerType(typeof(ComplexSerializerType), typeof(v1.AnotherSerializerType));
81+
serializer.AddSerializerType(typeof(ComplexSerializerType), typeof(v2.SomeSerializerType));
82+
serializer.AddSerializerType(typeof(ComplexSerializerType), typeof(v2.AnotherSerializerType));
83+
84+
var stream = await serializer.SerializeAsync(complex);
85+
var xml = await new StreamReader(stream).ReadToEndAsync();
86+
87+
Assert.IsTrue(xml.Contains(complex.Id.ToString()));
88+
89+
stream.Position = 0;
90+
91+
Assert.AreEqual(complex.Id, ((ComplexSerializerType)await serializer.DeserializeAsync(typeof(ComplexSerializerType), stream)).Id);
92+
93+
Console.WriteLine(xml);
94+
95+
var some1 = new v1.SomeSerializerType();
96+
var some2 = new v2.SomeSerializerType();
97+
98+
Assert.AreEqual(some1.Id, ((v1.SomeSerializerType)await serializer.DeserializeAsync(typeof(v1.SomeSerializerType), await serializer.SerializeAsync(some1))).Id);
99+
Assert.AreEqual(some2.Id, ((v2.SomeSerializerType)await serializer.DeserializeAsync(typeof(v2.SomeSerializerType), await serializer.SerializeAsync(some2))).Id);
100+
}
54101
}
55102
}

Shuttle.Core.Serialization.Tests/Shuttle.Core.Serialization.Tests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
</PropertyGroup>
66

77
<ItemGroup>
8-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" />
9-
<PackageReference Include="NUnit" Version="3.13.3" />
10-
<PackageReference Include="NUnit3TestAdapter" Version="4.3.1" />
8+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
9+
<PackageReference Include="NUnit" Version="3.14.0" />
10+
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
1111
</ItemGroup>
1212

1313
<ItemGroup>

Shuttle.Core.Serialization/.package/package.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
<repository type="git" url="https://github.com/shuttle/Shuttle.Core.Serialization.git" />
1414
<projectUrl>https://github.com/shuttle/Shuttle.Core.Serialization</projectUrl>
1515
<description>Serialization adapter.</description>
16-
<copyright>Copyright (c) 2022, Eben Roux</copyright>
16+
<copyright>Copyright (c) 2024, Eben Roux</copyright>
1717
<tags>shuttle serialization</tags>
1818
<dependencies>
19-
<dependency id="Shuttle.Core.Contract" version="11.0.0" />
19+
<dependency id="Shuttle.Core.Contract" version="11.1.0" />
2020
</dependencies>
2121
</metadata>
2222
<files>

Shuttle.Core.Serialization/DefaultSerializer.cs

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Reflection;
55
using System.Text;
6+
using System.Threading.Tasks;
67
using System.Xml;
78
using System.Xml.Serialization;
89
using Shuttle.Core.Contract;
@@ -26,6 +27,7 @@ public DefaultSerializer()
2627
{
2728
_xmlWriterSettings = new XmlWriterSettings
2829
{
30+
Async = true,
2931
Encoding = Encoding.UTF8,
3032
OmitXmlDeclaration = true,
3133
Indent = true
@@ -42,9 +44,18 @@ public DefaultSerializer()
4244
}
4345

4446
public string Name => "Xml";
45-
public byte Id => 1;
4647

4748
public Stream Serialize(object instance)
49+
{
50+
return SerializeAsync(instance, true).GetAwaiter().GetResult();
51+
}
52+
53+
public async Task<Stream> SerializeAsync(object instance)
54+
{
55+
return await SerializeAsync(instance, false).ConfigureAwait(false);
56+
}
57+
58+
private async Task<Stream> SerializeAsync(object instance, bool sync)
4859
{
4960
Guard.AgainstNull(instance, nameof(instance));
5061

@@ -53,38 +64,59 @@ public Stream Serialize(object instance)
5364

5465
var xml = new StringBuilder();
5566

56-
using (var writer = XmlWriter.Create(xml, _xmlWriterSettings))
57-
{
58-
serializer.Serialize(writer, instance, _namespaces);
67+
using var writer = XmlWriter.Create(xml, _xmlWriterSettings);
68+
69+
serializer.Serialize(writer, instance, _namespaces);
5970

71+
if (sync)
72+
{
6073
writer.Flush();
6174
}
75+
else
76+
{
77+
await writer.FlushAsync().ConfigureAwait(false);
78+
}
6279

6380
var data = Encoding.UTF8.GetBytes(xml.ToString());
81+
6482
return new MemoryStream(data, 0, data.Length, false, true);
6583
}
6684

6785
public object Deserialize(Type type, Stream stream)
86+
{
87+
return DeserializeAsync(type, stream, true).GetAwaiter().GetResult();
88+
}
89+
90+
public async Task<object> DeserializeAsync(Type type, Stream stream)
91+
{
92+
return await DeserializeAsync(type, stream, false).ConfigureAwait(false);
93+
}
94+
95+
private async Task<object> DeserializeAsync(Type type, Stream stream, bool sync)
6896
{
6997
Guard.AgainstNull(type, nameof(type));
7098
Guard.AgainstNull(stream, nameof(stream));
7199

72-
using (var copy = new MemoryStream())
73-
{
74-
var position = stream.Position;
100+
using var copy = new MemoryStream();
101+
var position = stream.Position;
75102

76-
stream.Position = 0;
103+
stream.Position = 0;
104+
105+
if (sync)
106+
{
77107
stream.CopyTo(copy);
108+
}
109+
else
110+
{
111+
await stream.CopyToAsync(copy).ConfigureAwait(false);
112+
}
78113

79-
stream.Position = position;
80-
copy.Position = 0;
114+
stream.Position = position;
115+
copy.Position = 0;
81116

82-
83-
using (var reader = XmlDictionaryReader.CreateTextReader(copy, Encoding.UTF8, _xmlDictionaryReaderQuotas, null))
84-
{
85-
return GetSerializer(type).Deserialize(reader);
86-
}
87-
}
117+
using var reader = XmlDictionaryReader.CreateTextReader(copy, Encoding.UTF8, _xmlDictionaryReaderQuotas, null);
118+
119+
return GetSerializer(type).Deserialize(reader);
88120
}
89121

90122
public void AddSerializerType(Type root, Type contained)
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
using System;
22
using System.IO;
3+
using System.Threading.Tasks;
34

45
namespace Shuttle.Core.Serialization
56
{
67
public interface ISerializer
78
{
89
string Name { get; }
9-
byte Id { get; }
1010
Stream Serialize(object instance);
1111
object Deserialize(Type type, Stream stream);
12+
Task<Stream> SerializeAsync(object instance);
13+
Task<object> DeserializeAsync(Type type, Stream stream);
1214
}
1315
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Collections.Generic;
2+
3+
namespace Shuttle.Core.Serialization
4+
{
5+
public interface ISerializerService
6+
{
7+
ISerializerService Add(ISerializer serializer);
8+
ISerializer Get(string name);
9+
bool Contains(string name);
10+
IEnumerable<ISerializer> Serializers { get; }
11+
}
12+
}

Shuttle.Core.Serialization/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#endif
1515

1616
[assembly: AssemblyVersion("11.0.0.0")]
17-
[assembly: AssemblyCopyright("Copyright (c) 2022, Eben Roux")]
17+
[assembly: AssemblyCopyright("Copyright (c) 2024, Eben Roux")]
1818
[assembly: AssemblyProduct("Shuttle.Core.Serialization")]
1919
[assembly: AssemblyCompany("Eben Roux")]
2020
[assembly: AssemblyConfiguration("Release")]

Shuttle.Core.Serialization/Resources.Designer.cs

Lines changed: 81 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)