@@ -49,6 +49,46 @@ public void WriteYaml(IEmitter emitter, object value, Type type, ObjectSerialize
4949 }
5050}
5151
52+ public class IDictionaryTypeConverter : IYamlTypeConverter {
53+
54+ private bool omitNullValues ;
55+
56+ public IDictionaryTypeConverter ( bool omitNullValues = false ) {
57+ this . omitNullValues = omitNullValues ;
58+ }
59+
60+ public bool Accepts ( Type type ) {
61+ return typeof ( IDictionary ) . IsAssignableFrom ( type ) ;
62+ }
63+
64+ public object ReadYaml ( IParser parser , Type type , ObjectDeserializer rootDeserializer ) {
65+ var deserializedObject = rootDeserializer ( typeof ( IDictionary < string , object > ) ) as IDictionary ;
66+ return deserializedObject ;
67+ }
68+
69+ public void WriteYaml ( IEmitter emitter , object value , Type type , ObjectSerializer serializer ) {
70+ var hObj = ( IDictionary ) value ;
71+ emitter . Emit ( new MappingStart ( ) ) ;
72+ foreach ( DictionaryEntry entry in hObj ) {
73+ if ( entry . Value == null ) {
74+ if ( this . omitNullValues == true ) {
75+ continue ;
76+ }
77+ serializer ( entry . Key , entry . Key . GetType ( ) ) ;
78+ emitter . Emit ( new Scalar ( AnchorName . Empty , "tag:yaml.org,2002:null" , "" , ScalarStyle . Plain , true , false ) ) ;
79+ continue ;
80+ }
81+ serializer ( entry . Key , entry . Key . GetType ( ) ) ;
82+ if ( entry . Value is PSObject nestedObj ) {
83+ serializer ( nestedObj . BaseObject , nestedObj . BaseObject . GetType ( ) ) ;
84+ } else {
85+ serializer ( entry . Value , entry . Value . GetType ( ) ) ;
86+ }
87+ }
88+ emitter . Emit ( new MappingEnd ( ) ) ;
89+ }
90+ }
91+
5292public class PSObjectTypeConverter : IYamlTypeConverter {
5393
5494 private bool omitNullValues ;
@@ -70,7 +110,6 @@ public object ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeseria
70110
71111 public void WriteYaml ( IEmitter emitter , object value , Type type , ObjectSerializer serializer ) {
72112 var psObj = ( PSObject ) value ;
73-
74113 emitter . Emit ( new MappingStart ( ) ) ;
75114 foreach ( var prop in psObj . Properties ) {
76115 if ( prop . Value == null ) {
@@ -161,6 +200,7 @@ public static SerializerBuilder BuildSerializer(
161200 builder = builder
162201 . WithEventEmitter ( next => new StringQuotingEmitter ( next ) )
163202 . WithTypeConverter ( new BigIntegerTypeConverter ( ) )
203+ . WithTypeConverter ( new IDictionaryTypeConverter ( omitNullValues ) )
164204 . WithTypeConverter ( new PSObjectTypeConverter ( omitNullValues ) ) ;
165205 if ( omitNullValues == true ) {
166206 builder = builder
0 commit comments