Заставить WCF сериализовать неиспользуемый класс - PullRequest
2 голосов
/ 20 июля 2009

У меня возникает проблема со следующим фрагментом кода, в котором, когда я прихожу к указанию, что такое Предмет (например, CashInHand), фактический тип CashInHandPayment недоступен, поскольку он не был перенесен, когда я создать прокси-класс (скорее всего потому, что он не читается в XmlElementAttributes).

Есть ли способ принудительно сериализировать классы, такие как AccountPayment, CashInHandPayment и CCPayment в прокси-классе?

[DataContract]
public class Payment
{
    [XmlElementAttribute("Account", typeof(AccountPayment))]
    [XmlElementAttribute("CashInHand", typeof(CashInHandPayment))]
    [XmlElementAttribute("CreditCard", typeof(CCPayment))]
    [XmlChoiceIdentifierAttribute("ItemElementName")]
    [DataMember]
    public object Item { get; set; }
}

[DataContract]
public enum ItemElementName
{
    [EnumMember]
    Account,
    [EnumMember]
    CashInHand,
    [EnumMember]
    CreditCard
}

//This class will not be in the generated proxy class
[DataContract]
public class AccountPayment
{
    [DataMember]
    public double Amount { get; set; }
}

//classes for CashInHandPayment and CCPayment also created, but not shown.

Простите, если термин «сериализация» не является правильным термином, если вы прочитали вопрос и обнаружили, что это не так, измените его соответствующим образом!

Обновление - ответ, упомянутый Саймоном Свенссоном:

[KnownType(typeof(AccountPayment))]
[KnownType(typeof(CashInHandPayment))]
[KnownType(typeof(CCPayment))]
[DataContract]
public class Payment
{
    [XmlElementAttribute("Account", typeof(AccountPayment))]
    [XmlElementAttribute("CashInHand", typeof(CashInHandPayment))]
    [XmlElementAttribute("CreditCard", typeof(CCPayment))]
    [XmlChoiceIdentifierAttribute("ItemElementName")]
    [DataMember]
    public object Item { get; set; }
}

Большое спасибо, Саймон!

Ответы [ 3 ]

4 голосов
/ 20 июля 2009

Эммы. Разве XmlElementAttribute и XmlChoiceIdentifierAttribute xml сериализация, которая является более старой сериализацией по сравнению с DataContractSerializer, который считывает DataContractAttribute и DataMemberAttribute?

Я считаю, что вы должны использовать для этого KnownTypeAttribute, но я никогда не пробовал его, и у меня не было этого сценария в моем собственном коде.

0 голосов
/ 20 июля 2009

Я думаю, что указание DataContract должно быть достаточно. Но если это не работает, почему бы не попробовать создать фиктивный метод OperationContract, который использует класс?

0 голосов
/ 20 июля 2009

Есть ли способ заставить классы, такие как AccountPayment, CashInHandPayment и CCPayment, которые будут сериализованы в прокси-классе?

Они должны быть помечены атрибутом [DataContract], которого, я думаю, должно быть достаточно.

Когда svcutil.exe (запущенный непосредственно из командной строки или из Visual Studio с использованием Add Service Reference) встречает классы с атрибутом [DataContract] в классе и [DataMember] в свойствах (или полях), он будет создайте копию в прокси для этих классов.

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...