@@ -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 ) {
@@ -81,7 +120,17 @@ public void WriteYaml(IEmitter emitter, object value, Type type, ObjectSerialize
81120 emitter . Emit ( new Scalar ( AnchorName . Empty , "tag:yaml.org,2002:null" , "" , ScalarStyle . Plain , true , false ) ) ;
82121 } else {
83122 serializer ( prop . Name , prop . Name . GetType ( ) ) ;
84- serializer ( prop . Value , prop . Value . GetType ( ) ) ;
123+ var objType = prop . Value . GetType ( ) ;
124+ var val = prop . Value ;
125+ if ( prop . Value is PSObject nestedPsObj ) {
126+ var nestedType = nestedPsObj . BaseObject . GetType ( ) ;
127+ if ( nestedType != typeof ( System . Management . Automation . PSCustomObject ) ) {
128+ objType = nestedPsObj . BaseObject . GetType ( ) ;
129+ val = nestedPsObj . BaseObject ;
130+ }
131+ }
132+ serializer ( val , objType ) ;
133+
85134 }
86135 }
87136 emitter . Emit ( new MappingEnd ( ) ) ;
@@ -151,6 +200,7 @@ public static SerializerBuilder BuildSerializer(
151200 builder = builder
152201 . WithEventEmitter ( next => new StringQuotingEmitter ( next ) )
153202 . WithTypeConverter ( new BigIntegerTypeConverter ( ) )
203+ . WithTypeConverter ( new IDictionaryTypeConverter ( omitNullValues ) )
154204 . WithTypeConverter ( new PSObjectTypeConverter ( omitNullValues ) ) ;
155205 if ( omitNullValues == true ) {
156206 builder = builder
0 commit comments