Avatar billede dehaas Nybegynder
08. august 2006 - 00:27 Der er 27 kommentarer og
1 løsning

Custom Object i WebService

Hej,

Er for første gang begyndt at lege lidt med webservices. Jeg har nu et lille problem. Jeg skal returnere mit eget object. Når jeg gør det, og køre en test, får jeg denne fejl:

System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: Kaje cannot be serialized because it does not have a parameterless constructor.
  at System.Xml.Serialization.TypeDesc.CheckSupported()
  at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
  at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type)
  at System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException(Type type)
  at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
  at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
  at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write2_ArrayOfAnyType(Object o)
  at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayListSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
  at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
  --- End of inner exception stack trace ---
  at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
  at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle)
  at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces)
  at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
  at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o)
  at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
  at System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
  at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
  at System.Web.Services.Protocols.WebServiceHandler.Invoke()

---

Mit object ser sådan ud:

Public Class Kaje
    Implements IComparable

    Private _kaje As String
    Private _point As Integer

    Public Sub New(ByVal kaje As String, ByVal point As Integer)
        MyBase.New()
        _kaje = kaje
        _point = point
    End Sub

    Public ReadOnly Property Kaje() As String
        Get
            Return _kaje
        End Get
    End Property

    Public ReadOnly Property Point() As Integer
        Get
            Return _point
        End Get
    End Property

    Public Function CompareTo(ByVal o As Object) As Integer Implements IComparable.CompareTo
        Dim mo As Kaje = CType(o, Kaje)
        If _point = mo._point Then
            Return _kaje.CompareTo(mo._kaje)
        Else
            Return _point - mo._point
        End If
    End Function


End Class

-----
Avatar billede snepnet Nybegynder
08. august 2006 - 00:39 #1
Den siger du skal have en constructor på din klasse der ikke tager parametre:

    Public Sub New()
        MyBase.New()
    End Sub

Mvh
Avatar billede dehaas Nybegynder
08. august 2006 - 00:43 #2
Hmm.. Nu er min klasse sådan ud:

Imports Microsoft.VisualBasic

Public Class Kaje
    Implements IComparable

    Private _kaje As String
    Private _point As Integer

    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub New(ByVal kaje As String, ByVal point As Integer)
        _kaje = kaje
        _point = point
    End Sub

    Public ReadOnly Property Kaje() As String
        Get
            Return _kaje
        End Get
    End Property

    Public ReadOnly Property Point() As Integer
        Get
            Return _point
        End Get
    End Property

    Public Function CompareTo(ByVal o As Object) As Integer Implements IComparable.CompareTo
        Dim mo As Kaje = CType(o, Kaje)
        If _point = mo._point Then
            Return _kaje.CompareTo(mo._kaje)
        Else
            Return _point - mo._point
        End If
    End Function


End Class


----------

Men fejlen er der stadig?
Avatar billede dehaas Nybegynder
08. august 2006 - 00:49 #3
Jeg tror der er fordi jeg mangler noget i min webservice, den ser sådan ud:

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class StarC
    Inherits System.Web.Services.WebService

    Dim Location As String = "C:\Wikwak.txt" 'Server.MapPath("App_Data/Highscore.txt")

    Private Function GetArray() As ArrayList
        Dim Array As New ArrayList

        If System.IO.File.Exists(Location) Then
            Dim _stop As Boolean = False
            Dim Reader As New System.IO.StreamReader(Location)

            While _stop = False
                Dim Kaje As String = Reader.ReadLine()
                Dim Point As Integer = System.Convert.ToInt32(Reader.ReadLine())
                Dim Wikwak As New Kaje(Kaje, Point)
                If (Not Wikwak.Kaje = "") Then
                    Array.Add(Wikwak)
                Else
                    _stop = True
                End If
            End While

            Reader.Close()
        End If

        Return Array
    End Function

    <WebMethod()> _
    Public Sub InsertKaje(ByVal name As String, ByVal point As Integer)
        Dim Array = GetArray()
        Array.Add(New Kaje(name, point))

        Array.Sort()

        Dim Writer As New System.IO.StreamWriter(Location)
        Dim i As Integer

        For i = 0 To Array.Count() - 1
            Writer.WriteLine(CType(Array(i), Kaje).Kaje)
            Writer.WriteLine(CType(Array(i), Kaje).Point)
        Next

        Writer.Close()
    End Sub

    <WebMethod()> _
    Public Function GetTopscore() As ArrayList
        Dim Array As ArrayList = GetArray()
        Dim NewArray As New ArrayList

        'Dim til As Integer = 0
        'If Array.Count() < (kajer - 1) Then
        'til = Array.Count() - 1
        'Else
        'til = kajer
        'End If

        'Array.Sort()

        'Dim i As Integer
        'For i = 0 To til
        'NewArray.Add(Array.Item(i))
        'Next

        Return Array
    End Function

    <WebMethod()> _
    Public Function ArrayKaje() As ArrayList
        Dim Array As ArrayList = GetArray()
        Dim NewArray As New ArrayList

        Dim i As Integer
        For i = 0 To Array.Count - 1
            NewArray.Add(CType(Array.Item(i), Kaje).Kaje)
        Next

        NewArray.Sort()
        Return NewArray
    End Function

    <WebMethod()> _
    Public Function ArrayPoint() As ArrayList
        Dim Array As ArrayList = GetArray()
        Dim NewArray As New ArrayList

        Dim i As Integer
        For i = 0 To Array.Count - 1
            NewArray.Add(CType(Array.Item(i), Kaje).Point)
        Next

        NewArray.Sort()
        Return NewArray
    End Function

    <WebMethod()> _
    Public Sub Reset()

        If System.IO.File.Exists(Location) Then
            System.IO.File.Delete(Location)
        End If

    End Sub

End Class
Avatar billede _basil Nybegynder
08. august 2006 - 08:55 #4
Som Snepnet siger. Lav en constructor der ikke tager nogen parametre..
Tror ikke der er noget galt med din webservice:)
Avatar billede dehaas Nybegynder
08. august 2006 - 13:05 #5
Beklager, men er altså ikke helt med på hvad i mener
Avatar billede snepnet Nybegynder
08. august 2006 - 13:42 #6
På hvilken linie optræder fejlen?
Mvh
Avatar billede dehaas Nybegynder
08. august 2006 - 15:09 #7
Den sker når jeg prøver at teste min Webservice. Når jeg trykker 'Invoke'
Avatar billede snepnet Nybegynder
08. august 2006 - 15:17 #8
Har du mulighed for at lægge projektet til download et sted (inklusiv den fil du henter data fra).
Mvh
Avatar billede dehaas Nybegynder
08. august 2006 - 15:27 #9
Avatar billede snepnet Nybegynder
08. august 2006 - 16:21 #10
De første par metoder virker fint her - andre fejler med andre exceptions end den du har skrevet herude.
Mvh
Avatar billede dehaas Nybegynder
08. august 2006 - 17:25 #11
Ja, det er GetTopscore der er problemet. Det er ligesomom den ikke kender mit object
Avatar billede snepnet Nybegynder
08. august 2006 - 17:44 #12
Prøv at smid den her over din klasse:
<XmlInclude(GetType(Kaje))> _

Altså så klassen ser sådan her ud:
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<XmlInclude(GetType(Kaje))> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class StarC

Mvh
Avatar billede dehaas Nybegynder
08. august 2006 - 17:54 #13
Hmm, nu ser det i hvert fald noget bedre ud. Prøver det af i client-applicationen (Flash) i aften.
Avatar billede snepnet Nybegynder
08. august 2006 - 17:56 #14
Fino.
Mvh
Avatar billede dehaas Nybegynder
09. august 2006 - 15:36 #15
Hmm, nu kan det i flash lade sig gøre at tælle hvor mange objecter arrayet indeholder (hvilket det ikke var før). Men den kan ikke se hvilken type objecter det er.
Avatar billede snepnet Nybegynder
09. august 2006 - 15:45 #16
Jeg har ingen forstand på flash.
Mvh
Avatar billede snepnet Nybegynder
09. august 2006 - 15:46 #17
Men du får jo noget xml til din flashapplikation, og det kan du jo så pakke ud der.
Mvh
Avatar billede dehaas Nybegynder
09. august 2006 - 15:54 #18
Jo det ved jeg. Det er heller ikke mig der laver flash, så skal til at prøve at teste med en simpel Forms Application.

Der har jeg et lille problem. Jeg får et alm System.Array ind, men har brug for en ArrayList. Hvordan konverterer jeg denne?
Avatar billede snepnet Nybegynder
09. august 2006 - 16:10 #19
ArrayList liste = ArrayList.Adapter(dinarrayinstans);
Mvh
Avatar billede dehaas Nybegynder
09. august 2006 - 16:16 #20
Hmm har list problem, clienten kender jo ikke objectet 'kaje'
Avatar billede snepnet Nybegynder
09. august 2006 - 16:29 #21
Hvad mener du med list problem?
Hvis klienten ikke kender typen, må du jo får noget fornuftigt ud af xml'en hos klienten (det var det jeg mente med at du måtte pakke xml'en ud)
Mvh
Avatar billede dehaas Nybegynder
09. august 2006 - 16:36 #22
Hmm. Er det da ikke muligt at få client til at kende opjectet? Jeg har set dette før.
Avatar billede snepnet Nybegynder
09. august 2006 - 17:04 #23
Joda.
Du kan distribuere typen i en assembly så du kan kompilere op imod den.
Mvh
Avatar billede snepnet Nybegynder
09. august 2006 - 17:07 #24
Du skal være opmærksom på, at den slags ikke er så fedt, hvis typen ændrer sig kontinuerligt...
Det er mest hensigtsmæssigt, hvis du kan basere den slags på interfaces istedet, og lade den konkrete implementering ligge ét sted.
Mvh
Avatar billede dehaas Nybegynder
09. august 2006 - 17:39 #25
ohja, det var da en god ide. Prøver mig lige lidt frem.
Avatar billede dehaas Nybegynder
09. august 2006 - 17:59 #26
Hmm, jeg har nu lavet et lille bibliotek kaldet StarC_Library.

Jeg bruger denne ligelle kode til at teste med:

        Dim Array As System.Array = Service.GetTopscore(5)
        Dim List As ArrayList = ArrayList.Adapter(Array)
        Dim Test As String = CType(List.Item(1), Kaje).Point

Jeg får nu denne fejl: Unable to cast object of type 'StarC_Service_Test.StarC.Kaje' to type 'StarC_Library.Kaje'.
Avatar billede dehaas Nybegynder
11. august 2006 - 14:03 #27
Tror vist du har fået hjulpet mig mere end rigeligt vidre med min webservice. Mange tak for hjælpen. Smid et svar.
Avatar billede snepnet Nybegynder
11. august 2006 - 14:12 #28
Har ikke set din sidste post - håber du er kommet videre med det.
Mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester