|
1 | | -using Dahomey.Cbor.Serialization.Conventions; |
| 1 | +using Dahomey.Cbor.Attributes; |
| 2 | +using Dahomey.Cbor.Serialization.Conventions; |
2 | 3 | using Dahomey.Cbor.Serialization.Converters.Mappings; |
3 | 4 | using Dahomey.Cbor.Util; |
4 | 5 | using System; |
5 | 6 | using System.Collections.Generic; |
6 | | -using System.ComponentModel; |
7 | 7 | using System.Linq; |
8 | 8 | using System.Reflection; |
9 | 9 |
|
@@ -209,17 +209,32 @@ public override void Write(ref CborWriter writer, T value) |
209 | 209 | obj = value, |
210 | 210 | }; |
211 | 211 |
|
212 | | - if (_objectMapping.CreatorMapping == null && value.GetType() != typeof(T)) |
| 212 | + Type declaredType = typeof(T); |
| 213 | + Type actualType = value.GetType(); |
| 214 | + |
| 215 | + if (_objectMapping.CreatorMapping == null && actualType != declaredType) |
213 | 216 | { |
214 | | - context.state = MapWriterContext.State.Discriminator; |
215 | 217 | context.objectConverter = (IObjectConverter)_registry.ConverterRegistry.Lookup(value.GetType()); |
216 | 218 | } |
217 | 219 | else |
218 | 220 | { |
219 | | - context.state = MapWriterContext.State.Properties; |
220 | 221 | context.objectConverter = this; |
221 | 222 | } |
222 | 223 |
|
| 224 | + CborDiscriminatorPolicy discriminatorPolicy = _objectMapping.DiscriminatorPolicy != CborDiscriminatorPolicy.Default ? _objectMapping.DiscriminatorPolicy |
| 225 | + : (writer.Options.DiscriminatorPolicy != CborDiscriminatorPolicy.Default ? writer.Options.DiscriminatorPolicy : CborDiscriminatorPolicy.Auto); |
| 226 | + |
| 227 | + if (_objectMapping.CreatorMapping == null && |
| 228 | + (discriminatorPolicy == CborDiscriminatorPolicy.Always |
| 229 | + || discriminatorPolicy == CborDiscriminatorPolicy.Auto && actualType != declaredType)) |
| 230 | + { |
| 231 | + context.state = MapWriterContext.State.Discriminator; |
| 232 | + } |
| 233 | + else |
| 234 | + { |
| 235 | + context.state = MapWriterContext.State.Properties; |
| 236 | + } |
| 237 | + |
223 | 238 | writer.WriteMap(this, ref context); |
224 | 239 |
|
225 | 240 | if (_objectMapping.OnSerializedMethod != null) |
|
0 commit comments