diff --git a/src/Hocon.Configuration.Test/ConfigurationSpec.cs b/src/Hocon.Configuration.Test/ConfigurationSpec.cs index 414badd7..ffbe53ae 100644 --- a/src/Hocon.Configuration.Test/ConfigurationSpec.cs +++ b/src/Hocon.Configuration.Test/ConfigurationSpec.cs @@ -10,7 +10,9 @@ using System.Linq; using System.Reflection; using FluentAssertions; +using Hocon.Debugger; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using Xunit; @@ -30,6 +32,19 @@ public class MyObjectConfig public int[] IntergerArray { get; set; } } + [Fact] + public void Config_should_be_serializable() + { + var config = ConfigurationFactory.ParseString(@" + foo{ + bar.biz = 12 + baz = ""quoted"" + }"); + var serialized = JsonConvert.SerializeObject(config); + var deserialized = JsonConvert.DeserializeObject(serialized); + config.DumpConfig().Should().Be(deserialized.DumpConfig()); + } + [Fact] public void CanEnumerateQuotedKeys() { @@ -549,7 +564,7 @@ public void ShouldSerializeFallbackValues() /// /// Source issue: https://github.com/akkadotnet/HOCON/issues/175 /// - [Fact] + [Fact(Skip = "This is disabled due to temprorary fix for https://github.com/akkadotnet/HOCON/issues/206")] public void ShouldDeserializeFromJson() { var settings = new JsonSerializerSettings diff --git a/src/Hocon.Configuration/Config.cs b/src/Hocon.Configuration/Config.cs index b2c0b91d..eb5e1f58 100644 --- a/src/Hocon.Configuration/Config.cs +++ b/src/Hocon.Configuration/Config.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; namespace Hocon { @@ -16,8 +17,11 @@ namespace Hocon /// the internal representation of a HOCON (Human-Optimized Config Object Notation) /// configuration string. /// - public class Config : HoconRoot + [Serializable] + public class Config : HoconRoot, ISerializable { + public const string SerializedPropertyName = "_dump"; + [Obsolete("For json serialization/deserialization only", true)] private Config() { @@ -206,6 +210,23 @@ private HoconValue GetRootValue() return aggregated; } + + /// + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue(SerializedPropertyName, this.ToString(useFallbackValues: true), typeof(string)); + } + + [Obsolete("Used for serialization only", true)] + public Config(SerializationInfo info, StreamingContext context) + { + var config = ConfigurationFactory.ParseString(info.GetValue(SerializedPropertyName, typeof(string)) as string); + + Value = config.Value; + Fallback = config.Fallback; + + Root = GetRootValue(); + } } ///