2013-09-16 7 views
0

В службах WCF не удается перейти на DataContract Serialization прямо сейчас. Мне нужно управлять поведением xml-serialization по умолчанию.Настройка XmlSerialization в WCF?

Вот мои классы POCO, на которых мне нужно получить полный контроль над процессом сериализации.

[Serializable] 
public class ProductBase 
{ 
    public int Id { get; set; } 
} 

[Serializable] 
public class DurableProduct : ProductBase 
{ 
    public string Name { get; set; } 
    public Price Pricing { get; set; } 
} 

[Serializable] 
public class Price : IXmlSerializable 
{ 
    public int Monthly { get; set; } 
    public int Annual { get; set; } 
} 

мне нужен контроль над сериализации процессом классов DurableProduct, Price. Таким образом, я реализовал IXmlSerializable этих классов, как показано ниже -

[Serializable] 
public class DurableProduct : ProductBase, IXmlSerializable 
{ 
    public string Name { get; set; } 
    public Price Pricing { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     Id = int.Parse(reader.ReadElementString()); 
     Name = reader.ReadElementString(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteElementString("Id", Id.ToString()); 
     writer.WriteElementString("Name", Name); 
    } 

    public override string ToString() 
    { 
     return string.Format("Id : {0}, Name: {1}, Monthly: {2}", Id, Name, Pricing.Monthly); 
    } 
} 

[Serializable] 
public class Price : IXmlSerializable 
{ 
    public int Monthly { get; set; } 
    public int Annual { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     //Control never reaches here, while deserializing DurableProduct 
     Monthly = int.Parse(reader.ReadElementString()); 
     Annual = int.Parse(reader.ReadElementString()); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     //Control never reaches here, while deserializing DurableProduct 
     writer.WriteElementString("MyCustomElement1", Monthly.ToString()); 
     writer.WriteElementString("MyCustomElement2", Annual.ToString()); 
    } 
} 

Проблема При попытке сериализации/десериализации там классы IXmlSerializable => ReadXml/WriteXml не называют.

Как я реализую свои классы так, что все чтения/записи реализаций IXmlSerializable надежно вызывается.

ответ

0

Вы можете попробовать украсить свой контракт работы с тезисами атрибуты:

[OperationContract(Action = "urn:yourActionNamesapce", ReplyAction = "urn:yourReplyActionNamesapce")] 
[XmlSerializerFormat()] 
[ServiceKnownType(typeof(ProductBase))] 
[ServiceKnownType(typeof(DurableProduct))] 
[ServiceKnownType(typeof(Price))] 
YourResponse YourOperation(DurableProduct request); 

Тогда у вас есть только передать свой ПОКО клиенту, при вызове веб-службы.

DurableProduct request = ... 
using (YourClient client = new YourClient()) 
{ 
    client.YourOperation(request); 
} 
Смежные вопросы