Coder Social home page Coder Social logo

Comments (7)

mcatanzariti avatar mcatanzariti commented on June 19, 2024

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

  1. 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);
  1. 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.

TMaddox avatar TMaddox commented on June 19, 2024

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.

mcatanzariti avatar mcatanzariti commented on June 19, 2024

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.

TMaddox avatar TMaddox commented on June 19, 2024

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.

TMaddox avatar TMaddox commented on June 19, 2024

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.

mcatanzariti avatar mcatanzariti commented on June 19, 2024

Reproduced

from dahomey.cbor.

mcatanzariti avatar mcatanzariti commented on June 19, 2024

fix in 1.4.0

from dahomey.cbor.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.