Announcement

Collapse
No announcement yet.

return einer Liste mit Objekten - Serialisierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • return einer Liste mit Objekten - Serialisierung

    Hallo zusammen,

    ich möchte in einem WebService eine Liste mit Objekte zurückgeben. Wie gehe ich das an? Ich denke mit Serialisierung. Habe leider nur keine Ahnung wie?

    hier der WebService

    [highlight=c#]
    [WebMethod]
    public ArrayList getMeasureIntervals()
    {
    DBFactory fac = new DBFactory();
    ArrayList list;

    try
    {
    // open db connection
    fac.OpenDBConnection();

    // select query to get MeasureIntervals
    list = fac.getMeasureInterval();

    // close db connection
    fac.CloseDBConnection();
    }
    catch (Exception e)
    {
    list = null;
    }

    return list;
    }
    [/highlight]

    Hier die Klasse bzw. Objekte die zurück gegeben werden:

    [highlight=c#]
    public class MeasureInterval
    {
    private int deviceId;
    private int interval;

    public MeasureInterval(){}

    public MeasureInterval(int deviceId, int interval)
    {
    this.deviceId = deviceId;
    this.interval = interval;
    }

    public int getDeviceid()
    {
    return deviceId;
    }

    public int getInterval()
    {
    return interval;
    }
    }
    [/highlight]

    Bitte um Hilfe!! Danke!
    Zuletzt editiert von gfoidl; 14.07.2009, 11:14. Reason: Code-Foramtierung - chehilbi legt ja keinen Wert darauf

  • #2
    Auf der WebService Seite bin ich jetzt wie folgt vorgegangen:

    [highlight=c#]
    [WebMethod]
    [System.Xml.Serialization.XmlInclude(typeof(Measure Interval))]
    public ArrayList getMeasureIntervals()
    {
    DBFactory fac = new DBFactory();
    ArrayList list;
    .....


    [Serializable]
    public class MeasureInterval
    {
    private int deviceId;
    private int interval;
    [/highlight]

    Bekomme jetzt aber in der C# Client Anwendung einen Deserialsierungs Fehler????
    Hat jemand eine Idee?

    hier die Fehlermeldung aus der Client Anwendung:

    Der Formatierer hat beim Deserialisieren der Nachricht eine Ausnahme ausgelöst: Fehler beim Deserialisieren von Parameter .... Die InnerException-Nachricht war "Fehler in Zeile 1, Position 344. Das Element ..." enthält Daten des Datenvertrags "...". Dem Deserialisierungsprogramm ist kein Typ bekannt, der diesem Vertrag zugeordnet ist. Fügen Sie den entsprechenden Typ für "MeasureInterval" der Liste der bekannten Typen hinzu. Verwenden Sie dazu z. B. das Attribut "KnownTypeAttribute", oder fügen Sie den Typ der an DataContractSerializer übergebenen Liste von bekannten Typen hinzu.". Weitere Details finden Sie unter "InnerException".
    Zuletzt editiert von gfoidl; 14.07.2009, 11:16. Reason: Formatierung - chehilbi legt ja keinen Wert darauf dass ihm geholfen wird

    Comment


    • #3
      ich muss noch einmal meine verzweiflung ausdrücken. im internet ist nichts brauchbares zu finden, wie so oft!!! kann mir keiner helfen!!!! bitte!

      Comment


      • #4
        also ich hab jetzt eine lösung hierfür gefunden. übergeben jetzt einfach einen sql DataSet und verarbeite diesen dann in meiner Client Anwendung.

        Übergabe von eigenen Objekten funktioniert, wobei sämtliche Funktionalität (Methoden) verloren gehen. Außerdem müssen die Attribute public sein!
        Die Übergabe von einem Array das Objektreferenzen enthält habe ich leider nicht hin bekommen, aber wie gesagt über den DataSet ist es eigentlich eine ganz gute Lösung!

        Comment


        • #5
          Array des Datentyps

          warum nicht MeasureInterval[] als Rückgabetyp?

          Comment


          • #6
            ich habe das gleiche problem und habe auch datasets als lösung genommen.

            allerdings finde ich die lösung nicht "schön", da die web-schnittstelle immer ein dataset ist. ich fände es besser, wenn man irgendwie seine eigenen datentypen übers netz schicken könnte.

            ich habe zB ein "benutzer"-objekt, das vom webservice zurückgegeben werden soll. dies benutzer-klasse liegt in einer klassenbibliothek und ist dem webservice und einem consolen-client mit using-direktive bekannt.
            das programm kann aber nicht kompiliert werden - es kommt immer die fehlermeldung:
            Fehler 1 Eine Konvertierung vom Typ "ConsoleApplication1.ServiceReference1.Benutze r" in "ClassLibrary1.Benutzer" ist nicht möglich. C:\Temp\Test_eigeneDatentypen\ConsoleApplication1\ Program.cs 14 29 ConsoleApplication1
            was muss ich da tun?

            Comment


            • #7
              Hallo klimmbimm,

              ich weiß jetzt nicht wie deine Klasse ausschauht aber beim Hinzufügen des Dienstverweises/Webverweises werden Proxy-Klassen erstellt. In diesen Klassen ist auch eine für den Benutzer-Objekt enthalten. Wird diese Klasse verwendet sollte es keine Probleme geben.

              Es kann sein dass die erstellte Klasse ein wenig anders aussieht als die von dir erstellte Klasse.

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Originally posted by gfoidl View Post
                Hallo klimmbimm,

                ich weiß jetzt nicht wie deine Klasse ausschauht aber beim Hinzufügen des Dienstverweises/Webverweises werden Proxy-Klassen erstellt. In diesen Klassen ist auch eine für den Benutzer-Objekt enthalten. Wird diese Klasse verwendet sollte es keine Probleme geben.

                Es kann sein dass die erstellte Klasse ein wenig anders aussieht als die von dir erstellte Klasse.

                mfG Gü
                HA! cool, das tuts.
                hab benutze in der konsolen anwendung jetzt das benutzerobjekt aus dem dienstverweis (ConsoleApplication1.ServiceReference1.Benutzer), statt aus meiner klassenbibliothek (ClassLibrary1.Benutzer)
                Der Webservice hat nur zugriff auf die klassenbibliothek und kennt daher das Benutzerobjekt.

                Comment


                • #9
                  Der Webservice hat nur zugriff auf die klassenbibliothek und kennt daher das Benutzerobjekt.
                  Genau so soll es sein.

                  Stell dir vor jeder Client des Webservice müsste die Klassenbibliothek kennen. Das macht keinen Sinn und der Webservice wäre (fast) umsonst. Weiters stell dir vor der Client ist nicht mit .net programmiert (zB mit PHP). Deshalb ist nur dieser Weg der einzig gehbare.

                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment

                  Working...
                  X