diff --git a/src/ExtendedXmlSerializer/Configuration/ReferencedDeserializationContext.cs b/src/ExtendedXmlSerializer/Configuration/ReferencedDeserializationContext.cs
index a699edbc..c94ad1f3 100644
--- a/src/ExtendedXmlSerializer/Configuration/ReferencedDeserializationContext.cs
+++ b/src/ExtendedXmlSerializer/Configuration/ReferencedDeserializationContext.cs
@@ -3,6 +3,7 @@
using System.IO;
using System.Text;
using System.Xml;
+using XmlReader = System.Xml.XmlReader;
namespace ExtendedXmlSerializer.Configuration
{
@@ -32,7 +33,8 @@ public ReferencedDeserializationContext(IExtendedXmlSerializer @this, T existing
/// The serializer to configure.
/// The existing target instance.
/// The xml reader settings used for deserialization.
- public ReferencedDeserializationContext(IExtendedXmlSerializer serializer, T existing, XmlReaderSettings settings)
+ public ReferencedDeserializationContext(IExtendedXmlSerializer serializer, T existing,
+ XmlReaderSettings settings)
: this(InstanceReaders.Default.Get(serializer), existing, settings) {}
ReferencedDeserializationContext(IInstanceReader reader, T existing, XmlReaderSettings settings)
@@ -76,7 +78,18 @@ public T Deserialize(XmlReaderSettings settings, string data)
/// The initial provided target instance, assigned with values discovered in the provided document.
public T Deserialize(XmlReaderSettings settings, Stream stream)
{
- var reader = new XmlReaderFactory(settings, settings.NameTable.Context()).Get(stream);
+ using var reader = new XmlReaderFactory(settings, settings.NameTable.Context()).Get(stream);
+ return Deserialize(reader);
+ }
+
+ ///
+ /// Deserializes a document represented by the provided stream and assigns any values into the provided instance
+ /// context, using the provided reader settings.
+ ///
+ /// The reader representing the source document.
+ /// The initial provided target instance, assigned with values discovered in the provided document.
+ public T Deserialize(XmlReader reader)
+ {
var existing = new Existing(reader, _existing);
var result = (T)_reader.Get(existing);
return result;
diff --git a/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue630Tests.cs b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue630Tests.cs
new file mode 100644
index 00000000..7bc78e62
--- /dev/null
+++ b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue630Tests.cs
@@ -0,0 +1,77 @@
+using ExtendedXmlSerializer.Configuration;
+using ExtendedXmlSerializer.ContentModel.Format;
+using ExtendedXmlSerializer.ExtensionModel.Instances;
+using ExtendedXmlSerializer.Tests.ReportedIssues.Support;
+using FluentAssertions;
+using System;
+using System.Xml.Serialization;
+using Xunit;
+
+namespace ExtendedXmlSerializer.Tests.ReportedIssues
+{
+ public sealed class Issue630Tests
+ {
+ [Fact]
+ public void Verify()
+ {
+ var container = new ConfigurationContainer().Create().ForTesting();
+ var instance = new Terminate(true);
+ container.Cycle(instance).All.Should().BeTrue();
+ }
+
+ [Fact]
+ public void VerifyPassThroughValue()
+ {
+ var sut = new ConfigurationContainer().Type().WithMonitor(Monitor.Default).Create().ForTesting();
+
+ var instance = new Envelope { Version = 1.2f, SubObject = new() };
+ sut.Cycle(instance).SubObject.Version.Should().Be(1.2f);
+ }
+
+ sealed class Monitor : ISerializationMonitor
+ {
+ public static Monitor Default { get; } = new();
+
+ Monitor() {}
+
+ public void OnSerializing(IFormatWriter writer, Envelope instance) {}
+
+ public void OnSerialized(IFormatWriter writer, Envelope instance) {}
+
+ public void OnDeserializing(IFormatReader reader, Type instanceType) {}
+
+ public void OnActivating(IFormatReader reader, Type instanceType) {}
+
+ public void OnActivated(Envelope instance) {}
+
+ public void OnDeserialized(IFormatReader reader, Envelope instance)
+ {
+ instance.SubObject.Version = instance.Version;
+ }
+ }
+
+ sealed class Envelope
+ {
+ public float Version {get; set;}
+ public SubObject SubObject { get; set; }
+ }
+ sealed class SubObject {
+ public string Name {get; set;}
+ public float Version {get; set;}
+ }
+
+
+ public sealed class Terminate {
+ public Terminate() : this(null) {}
+
+ public Terminate(bool? all) => _all = all;
+
+ [XmlElement(ElementName = "All")]
+ private bool? _all = null;
+ public bool All {
+ get { return _all != null; }
+ }
+ }
+
+ }
+}