Sitter och designar en WebService som ska returnera en komplex datatyp. Att få ett resultat som ser ut enligt nedan är ju inga problem. Testa att använda ett fält eller egenskap som returnerar ett endimensionellt fält av email objekt. Jag har för mig att serializern bara klarar enkla fält, och inte saker som ArrayList eller Collection. I alla fall i beta 1. Provade följande kod men får felet: "System.NullReferenceException: Attempted to dereference a null object reference". Har fått det här felet vid flera andra tillfällen då jag pysslat med ASP.Net men inte lyckats klura ut varför i fridens namn jag får det. Public Class User Nu bara gissar, så jag ber om ursäkt för mina kollossala felsteg. Men kan man inte, typ skriva... Mmm... testade innan med Provade även dessa metoder men det ger följande fel: >Mmm... testade innan med Fick det inte att fungera först men sen hittade jag ett exempel på http://www.TomorrowsLearning.com (xml exemplet 'XML Serialization' i C#). XmlAttribute klassen har tydligen flera attribut så man måste peka på vilket man avser att sätta. Vill man få Phone klassen att resultera i följande utdataKomplexa Datatyper
<channel>
<guid></guid>
<emails>
<email></email>
</emails>
</channel>
Men hur gör jag om jag vill ha flera email element efter varandra så att jag kan returnera en lista. Hur ska emails-klassen se ut egentligen? Har provat med Hashtables m.fl. collection-objekt men inte lyckats få det att fungera.
Håkan Wennerberg
http://wennerberg.nu/Sv: Komplexa Datatyper
MSSv: Komplexa Datatyper
Public Class Fetcher
Public Function <WebMethod()> FetchUser() As User
Dim myUser As User = New User()
With myUser
.FName = "Hakan"
.LName = "Wennerberg"
.PhoneNumbers(0).Type = "Stationary" '<-- Error
.PhoneNumbers(0).Number = "+46 26 270000"
.PhoneNumbers(1).Type = "Mobile"
.PhoneNumbers(1).Number = "+46 70 2500000"
End With
Return (myUser)
End Function
End Class
Public Class User
Public FName As String = ""
Public LName As String = ""
Public PhoneNumbers(2) As Phone
End Class
Public Class Phone
Public Type As String = ""
Public Number As String = ""
End Class
// Håkan WennerbergSv: Komplexa Datatyper
Public FName As String = ""
Public LName As String = ""
Public PhoneNumbers(2) As New Phone ' ??? tror att du måste initialisera den va ??
End ClassSv: Komplexa Datatyper
Public Class User
Public FName As String = ""
Public LName As String = ""
Public PhoneNumbers() As Phone = New Phone(2)
End Class
Eller nåt sånt här:
Public Class User
Public FName As String = ""
Public LName As String = ""
Public PhoneNumbers(2) As Phone = New Phone
End Class
As New Phone har ver sama nackdel som i VB att en jämförelse görs vare gång den acccessa. Medans man nu kan ange ett värde för den i deklarationen.
/Andreas...Sv: Komplexa Datatyper
Public PhoneNumbers(2) As New Phone
men det fuckade. Vilket är givetvis är klart om man tänker till vilket man inte gör ibland *skyller förvirrat på att jag var trött* Istället gjorde jag så här (testade samtidigt att använda ReDim):
Public Class ComplexDatatype
Public Function <WebMethod()> FetchUser() As User
Dim myUser As User = New User()
With myUser
.FName = "Hakan"
.LName = "Wennerberg"
ReDim .PhoneNumbers(2)
.PhoneNumbers(0) = New Phone()
.PhoneNumbers(0).Type = "Stationary"
.PhoneNumbers(0).Number = "+46 26 270000"
.PhoneNumbers(1) = New Phone()
.PhoneNumbers(1).Type = "Mobile"
.PhoneNumbers(1).Number = "+46 70 2500000"
End With
Return (myUser)
End Function
End Class
Public Class User
Public FName As String = ""
Public LName As String = ""
Public PhoneNumbers() As Phone
End Class
Public Class Phone
Public Type As String = ""
Public Number As String = ""
End Class
Detta ger det önskade resultatet:
- <User xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns="http://tempuri.org/">
<FName>Hakan</FName>
<LName>Wennerberg</LName>
- <PhoneNumbers>
- <Phone>
<Type>Stationary</Type>
<Number>+46 26 270000</Number>
</Phone>
+ <Phone>
<Type>Mobile</Type>
<Number>+46 70 2500000</Number>
</Phone>
</PhoneNumbers>
</User>
När vi ändå är på gång... Är det någon som vet hur man kan skapa attribut i elementen?Sv: Komplexa Datatyper
New Phone(2)
- Ett fel inträffar då VB.Net tar attributet som konstruktor attribut.
Det andra ger också ett fel men jag minns inte vilket...Sv: Komplexa Datatyper
>
> Public PhoneNumbers(2) As New Phone
>
>men det fuckade.
Du skulle kunna använda
Public PhoneNumbers() As Phone = New Phone() {New Phone, New Phone}
Men snyggare är nog att läma det som det är
Public PhoneNumbers(2) As Phone
och initiera de båda Phone instanserna i en konstruktor, eller från koden som använder User klassen.
>Är det någon som vet hur man kan skapa attribut i elementen?
Är inte säker på detta, men jag tror du kan använda XmlAttribute attributet på de medlemmar du vill ska resultera i attribut iställt för egna taggar.
Public <XmlAttribute("FName")> FName As String
MSSv: Komplexa Datatyper
<Phone Type="Stationary" Number="+46 26 270000" />
Deklarerar man Phone klassen som
Public Class Phone
Public <XmlAttribute(AttributeName:="Type")> Type As String = ""
Public <XmlAttribute(AttributeName:="Number")> Number As String = ""
End Class
Tack för hjälpen!
Mvh,
Håkan Wennerberg
http://wennerberg.nu/