Comments (7)
The implementation of polymorphism in Dahomey.Cbor is based on a special field in which a special value is associated with an inherited class. The special field/value is called discriminator.
By default the discriminator field is named "_t" and the discriminator values are configured
- Either by using the attribute CborDiscriminatorAttribute:
[CborDiscriminator("Apple")]
public class Apple : Fruit { ... }
[CborDiscriminator("Orange")]
public class Orange : Fruit { ... }
Moreover , in this option, you need to register the assembly to allow the framework to discover the classed flagged by the CborDiscriminatorAttribute:
CborOptions.Default.Registry.DefaultDiscriminatorConvention.RegisterAssembly(typeof(Fruit ).Assembly);
- Or by API:
options.Registry.ObjectMappingRegistry.Register<Apple>(om => om.AutoMap().SetDiscriminator("Apple");
options.Registry.ObjectMappingRegistry.Register<Orange>(om => om.AutoMap().SetDiscriminator("Orange");
from dahomey.cbor.
I tried both examples and I also added the [CborDiscriminator("Name")] attribute on all classes implementing the Fruit class, but it still throws:
CborException: A CreatorMapping should be defined for interfaces or abstract classes
@mcatanzariti I am mentioning you by name because I do not have the permission to reopen this issue, but I feel like I should ask here.
from dahomey.cbor.
Did you try with the last official version?
The 2 examples I gave you are integrated in the automated tests and they don't fail
from dahomey.cbor.
yes with 1.3.2, I have broken it down to tree classes while testing and found out the following:
public class Tree
{
[CborProperty("age")]
public readonly int _age;
[CborProperty("fruit")]
public Fruit _fruit;
[CborConstructor]
public Tree(int age, Fruit fruit)
{
_age = age;
_fruit = fruit;
}
}
public abstract class Fruit
{
public string id2 = "myid"; // if I remove this it won't throw
}
[CborDiscriminator("Apple")]
public class Apple : Fruit
{
[CborProperty("type")]
public const string type = "I am an apple";
}
[CborDiscriminator("Orange")]
public class Orange : Fruit
{
[CborProperty("type")]
public const string type = "I am an orange";
}
from dahomey.cbor.
further, serializing the above example will output {"age": 10, "fruit": {}, "id": "123"}
, with fruit being empty, I have tried it with const fields and normal ones in combination with a constructor.
from dahomey.cbor.
Reproduced
from dahomey.cbor.
fix in 1.4.0
from dahomey.cbor.
Related Issues (20)
- Cannot serialize enum in object member HOT 1
- Project status HOT 1
- Security Issues with Polymorphic support in serialization
- How to convert CborValue to standard .NET type? HOT 2
- Storing a DateTime in CborValue/CborObject HOT 2
- Feature Suggestion: Support for reading multiple CBOR objects sequentially from a stream. HOT 3
- Override CborReader HOT 26
- ReadDataItem return type HOT 2
- Deserialize an array into Tuple HOT 2
- Support native AoT HOT 2
- Method not found !!0 Dahomey.Cbor.Cbor.Deserialize<!0>(System.ReadOnlySpan`1<byte>,Dahomey.Cbor.CborOptions) HOT 4
- Issue with Xamarin Forms linker and default constructor HOT 4
- Support record classes HOT 2
- Deserialization of abstract record class fails HOT 3
- Feature request: Add and support int key for CborPropertyAttribute HOT 2
- In DateTimeConverter, let DateTime.Kind be unspecified if it is in fact unspecified HOT 2
- Consider letting CborReader.SkipDataItem skip semantic tags HOT 1
- How-to do a Custom ArrayConverter HOT 2
- Consider adding CborWriter.WriteByteString(int) and WriteByteString(ReadOnlySequence<byte>) HOT 3
- Feature request: Add ReadOnlySequence<byte> overload to CborReader
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dahomey.cbor.