In a Web Service context, I have the following class which inherit from the class Mammal. The Mammal class is defined in a proxy. I cannot change the definition of that class. Because I need to add some methods to the class Mammal on the client side, I inherited Mammal and created Giraffe.
namespace TestApplication
{
public class Giraffe : Mammal
{
public Giraffe()
{
}
}
}
When I call a WebMethod which expect an object of type Mammal, I get the following exception telling me that Giraffe isn't expected.
Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o)
--- End of inner exception stack trace ---
Is there a workaround that? I cannot really add the XmlInclude...
Thanks!
-
To add methods, you should be using partial classes. Try adding a second class file with (in the right namespace etc):
partial class Mammal { public void ExtraMethod() {...} }
The
partial
keyword tells the compiler to allow the class to be split over multiple files - ideal for code-generation scenarios. It does, however, demand thepartial
keyword in every file; the members are simply combined (except for partial methods in C# 3.0 which have their own subtle behaviour). I hope that wsdl.exe (or whatever) includes this!Martin : I am afraid I cannot use a Partial class in this case. How do I change the class on the server?Marc Gravell : Out of curiosity, why not? In particular, proxies aren't at the server... what is it you are actually trying to do? So far your description is roughly "add methods to the client-side web-service proxy"; partial classes is the correct answer for that scenario... -
You have to use XmlInclude. It's your only choice. You have to tell the serializer what class you'll be serializing, since it has to generate the code to do the serialization.
It just struck me while writing this, that you might get away with having Giraffe implement IXmlSerializable, but that's even more work.
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.