Results 1 to 9 of 9

Thread: C# - Serialize Interface

  1. #1
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    966

    C# - Serialize Interface

    Er van uitgaande dat Delphi.NET en C# op dit punt dezelfde beperkingen zullen kennen deze vraag.

    Hoe serializeer ik een interface.

    Doelstelling:
    Ik wil een .xsd genereren op basis van interface, niet op basis van class. Hier krijg ik uiteraard (en dat is ook logisch) de melding dat ik een interface niet kan serializeren.

    Ietwat code:
    Code:
            private void button1_Click(object sender, EventArgs e)
            {
                var schemas = new XmlSchemas();
                var exporter = new XmlSchemaExporter(schemas);
                var mapping = new XmlReflectionImporter().ImportTypeMapping(typeof(IMyInterface));
                exporter.ExportTypeMapping(mapping);
                var schemaWriter = new StringWriter();
                foreach (XmlSchema schema in schemas)
                {
                    schema.Write(schemaWriter);
                }
                Clipboard.SetText(schemaWriter.ToString());
            }
    Nu kun je met reflection een hele hoop, maar ik heb eigenlijk weinig zin om dit zelf te doen. Ik kan me niet voorstellen dat er nog geen elegante oplossing voor is, vandaar deze vraag
    Objective reality is a delirium caused by lack of alcohol in blood

  2. #2
    Volgens mij kan dat niet omdat een interface niets is. De simpelste oplossing lijkt me om een classe te maken die de interface implementeert en die classe te gebruiken voor je XML.
    Marcel

  3. #3
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    966
    Hier was ik al bang voor.
    Maar ik dacht dat er zoiets was als ContractResolvers, waarbij ik dus indien het een interface is een object van het gewenste type aanmaak (IBedrijf heeft altijd een Bedrijf als class).

    Probleem is dat de classes al autogenerated zijn (t4).
    Neem als voorbeeld een bedrijf met meerdere afdelingen.
    Dat geeft bij ons een onderstaande class:
    Code:
        public partial class Bedrijf : IBedrijf
        {
            public virtual ICollection<IAfdeling> Afdelingen { get; set; }
        }
    De klasse hebben we dus al, het gaat er net om dat ik deze niet wil exporteren maar alleen hetgeen beschikbaar is via de interface.
    Probleem in deze klasse is dan wel weer dat hier ook weer interfaces in voor kunnen komen (zie de Afdelingen), maar dit is dan wel weer conform de interface. Dus voor een op zichzelf staande klasse zou dit wel werken, maar voor hoe het hier is opgezet loop ik dan ook vast.
    Nu kan ik dan wel weer alle interfaces uitbreiden met de class implementatie, maar dan gaan we het doel hier weer voorbij.

    Mijn oorspronkelijke gedachte was overigens om een WCF te bouwen, deze heeft dan voor de Interface objecten een implementatie (via de DataContractResolver en interfaces automatisch toestaan middels het ServiceKnownType attribuut een InterfaceProvider alle interfaces toe te staan (KnownType toe te voegen). Dit laatste is gelukt, maar ik krijg de DataContractResolver maar niet kloppend en debuggen werkt ook niet top.
    WCF wou ik gebruiken om de XSD's te laten genereren, maar aangezien dit niet heel eenvoudig gaat kan ik ook volstaan door deze laag weg te laten.
    Vandaar dit draadje...


    Enige oplossing die ik nu nog zie is om een eigen xsd te laten genereren op basis van reflection.
    Ik denk dat ik dit nog een nachtje moet laten bezinken, ik wil hier geen overhaaste conclusies aan verbinden.
    Objective reality is a delirium caused by lack of alcohol in blood

  4. #4
    Maar op een bepaald moment moeten het toch weer classes worden? Je zult ooit iets willen gaan doen met de inhoud van die XML. Dus stel even dat je bedrijven wilt importeren, dan heb heb je toch een classe ImportBedrijf nodig die je serialized vanuit je XML. Die ImportBedrijf zou dan ook degene zijn waarop je XSD is gebaseerd.
    Marcel

  5. #5
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    966
    Deserializeren is net hetgeen wat weer makkelijk gaat.
    Het serializeren is middels reflection ook geen enkel probleem, ik vind het alleen raar dat ik nergens invloed heb om een eigen serializer in dit proces te implementeren.
    Objective reality is a delirium caused by lack of alcohol in blood

  6. #6
    waarbij ik dus indien het een interface is een object van het gewenste type aanmaak (IBedrijf heeft altijd een Bedrijf als class).
    Dream on. Dan zou de compiler voorspellende gaven hebben.. want een interface declaratie zegt niks over de objecten die aan de property gehangen worden.. dus als je ziet staan,

    Code:
    Interface IModelObject
    {
      public int PayAmount;
    }
    class Pipo: IModelObject { // ..
    }
    class Mameloe: IModelObject { // ..
    }
    class Klukkluk: IModelObject { // ..
    }
    
    public class PayRollDetail
    {    
        public IModelObject Acteur { get; set; }
    }
    .. leuke getsetter, panklaar.. maar helaas, we weten niet WELK "Model" het is. Dus welke class zou je willen serialiseren ? Het is een public, dus in de code kan er een object van het type Pipo, Klukkluk en Mameloe ingeprikt zijn.. Reflection vereist runtime ook een instance (dacht ik), wat een I'tje wel is, maar niet alleen van de interface. Dus Reflection, zou die er zijn, levert te weinig informatie op.

    Interfaces.. ingewikkeld gedoe, ik vind data in interfaces eigenlijk sowieso verkeerd.. interfaces alleen met methods zie je ook veel vaker. Soms MOET je er een implementeren, omdat de library het vereist (bijv voor een ISerializable).. voor mijn eigen spaghetti vind ik superclassen makkelijker

    ik vind het alleen raar dat ik nergens invloed heb om een eigen serializer in dit proces te implementeren.
    Ok is dit oplosbaar.. ja.. als je die velden die alleen als I'tje bestaan overslaat. Ik heb het niet getest, maar probeer deze modifier, om foutmeldingen te vermijden (dit is een zwaktebod)

    Code:
    public class Example
    {
    // etc
    [NonSerialized]
        public IModelObject Acteur { get; set; }
    }
    Minstens ?®?®n hobby naast programmeerwerk is echt noodzakelijk

  7. #7
    Oja en

    Probleem is dat de classes al autogenerated zijn (t4).
    Je gebruikt MVC5 scaffolding of zo ? De templates kun je aanpassen. Copieer ze uit \Program Files en include ze dan in je project

    http://stackoverflow.com/questions/2...n-t4-templates
    Minstens ?®?®n hobby naast programmeerwerk is echt noodzakelijk

  8. #8
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    966
    @LxGoodies
    Conform het model dat hier opgezet is kan ik voor de interfaces die ik wil (de)serialiseren wel de aanname maken dat IBedrijf een Bedrijf moet aanmaken.
    Maar ook als dat nog op niets zou uitlopen, ik heb ook een businessfactory waarbij ik op basis van een interface automatisch de goede klasse aanmaak. Daar zit ook het probleem niet.

    Wat ik eenvoudig weg wil is het volgende.
    Ik maak een object, in dit geval een Bedrijf, dus:
    var bedrijf = new Bedrijf();
    Ik wil nu van bedrijf de interface IBedrijf serialiseren. Lijkt me logisch dat ik geen interface kan serialiseren indien er geen object onder hangt, maar in dit geval heb ik een object eronder, waarbij ik ook nog weet dat ik het ding als IBedrijf wil serialiseren.
    Objective reality is a delirium caused by lack of alcohol in blood

  9. #9
    Zul je toch ergens in je Serializer-naar-XML code naar (Bedrijf) moeten casten.. de Serializer moet weten, wat te rapporteren.

    Reflection kan niet omhoog kijken vanaf een I'tje zonder meer informatie. Er bestaat wel een class om het in te kunnen stellen (een DataContract)

    https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx

    hier staat wat uitleg in een van de bijdragen, en misschien andere oplossingen,

    http://stackoverflow.com/questions/1...rface-property

    Maar ik moet je eerlijk zeggen, dat dit boven mijn pet gaat hoor, zo diep ben ik er nooit ingedoken ik gebruik serialisation voor Ini-replacements en bij MVC i.g.v. Ajax.

    Daarvoor gebruik ik JSon. Dat is een ander format.
    Minstens ?®?®n hobby naast programmeerwerk is echt noodzakelijk

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •