Toon posts:

[C#] public interface serializen / SOAP *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Met behulp van een objectenboom kan de client aangeven welke capabilities de resultaten in de response moeten voldoen. De zoekcode heb ik al geschreven en ook de rest van de aanroep en de response gaan prima door middel van SOAP, alleen bij het public maken van de interface krijg ik probemen

Cannot serialize member Request.capability of type Capability because it is an interface.

Als ik de interface echter niet public maak krijg ik de melding dat de interface op een ander toegankelijkheidsniveau zit. Ik heb de interface wel nodig omdat een operator (zoals gebruikelijk in een boom) een eindnode kan bevatten maar ook een andere operator. Ik heb al wel vluchtig een poging gedaan om alles op te bouwen naar overerving maar daar kreeg ik dezelfde problemen.

Mijn vraag is dan ook, is hier een work-around voor? Suggesties hoe ik dit op een nette manier om kan bouwen zijn natuurlijk ook welkom.

De code van de interface en de classes die deze implementeren.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   public interface Capability
    {
    }

    public enum OperatorName { And, Or }

    public class CapabilityNode : Capability
    {
        public CapabilityNode()
        {
        }

        public bool not = false;
        public string propertyname;
        public string propertyvalue;
    }

    public class CapabilityOperator : Capability
    {
        public CapabilityOperator()
        {
        }

        public bool not = false;
        public OperatorName operatorname;
        public Capability capability1;
        public Capability capability2;
    }


Edit: codetags toegevoegd

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Pssst: code tags ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Sorry, ik was er zelf ook al mee bezig :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Tja, de serializer weet natuurlijk niet wat ie met die interface aanmoet.

Wat je kan doen, is DTO's definieren, en je objecten in zo'n DTO's zetten. Dan gebruik je in je webservice deze DTO's als return-type.

https://fgheysels.github.io/


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 20-11 21:40

Not Pingu

Dumbass ex machina

Een interface serializen is niet mogelijk, wat ook logisch is.
Wel zou je ipv. met een interface, met een base class kunnen werken.

Certified smart block developer op de agile darkchain stack. PM voor info.


Verwijderd

Topicstarter
Not Pingu schreef op maandag 02 juli 2007 @ 14:50:
Een interface serializen is niet mogelijk, wat ook logisch is.
Wel zou je ipv. met een interface, met een base class kunnen werken.
Allereerst bedankt voor de snelle reacties.

Ik was er al achter dat het niet mogelijk was, daarom was ik ook op zoek naar een workaround. De enige aanpassing die ik nu heb gedaan is "interface" veranderen naar "class". Hierdoor zijn de onderliggende classes niet direct meer beschikbaar vanaf de client (omdat deze niet in de request voorkomen maar alleen de "Capability" class).

Ik vraag me er twee webmethods bij te maken zodat de classes opgenomen worden in de wsdl of dat het netter is om de onderdelen zelf aan de wsdl toe te voegen. Is het mogelijk om deze toe te voegen op een manier waardoor deze toevoegingen ook weer in de wsdl komen te staan bij het opnieuw genereren van de wsdl? (Dit zal namelijk nog wel gebeuren bij vervolgprojecten).

[code=C#,1,4]
[WebMethod]
public CapabilityNode getCapabilityNode()
{
return new CapabilityNode();
}

[WebMethod]
public CapabilityOperator getCapabilityOperator()
{
return new CapabilityOperator();
}
[code]

Ps. Vreemd dat dit voor het weekend niet gelukt is, zo moeilijk was het allemaal niet :) Zal wel door het vrijdagmiddaggevoel komen ;)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Door middel van een DataContract en een DataContractSerializer (WCF)is het wel mogenlijk om inheritance toe te passen. MSDN linkje

Mischien dat je daar iets mee kunt

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1