Adil Mammadov
Adil Mammadov

Reputation: 8676

Which must be used with XmlSerializer and WCF - DataContract or MessageContract?

I need to write WCF service wich will take .xml file deserialize it into my custom calss and then do some operations on that data. I have written test version of this application which use console but not WCF. Here is how my code looks like:

[Serializable]
public class ErrorMsgElement
{
    [XmlElement("Sender")]
    public string SenderOfMessage{ get; set; }

    [XmlElement()]
    public Int64 UserID { get; set; }

    [XmlElement()]
    public Int64 SerialNumber { get; set; }

    [XmlElement("DateTime")]
    public DateTime DateAndTimeOfMessage { get; set; }
}


[Serializable]
[XmlRoot("Root")]
public class ErrorMessage
{
    [XmlElement("Header")]
    public string HeaderOfFile { get; set; }

    [XmlElement("ErrorMsg")]
    public ErrorMsgElement msgElent { get; set; }
}

And Main code

        ErrorMessage myErrorMsg = new ErrorMessage();
        //pathToFile is original path
        string path = @pathToFile;

        XmlSerializer myXmlSerializer = new XmlSerializer(typeof(ErrorMessage));

        using (StreamReader myStrReader = new StreamReader(path))
        {
            myErrorMsg = (ErrorMessage)myXmlSerializer.Deserialize(myStrReader);
        }

        //some operations on myErrorMsg such as writing to database

It works fine in console application. Now I need to write same logic in WCF service. But I don't know what should I use - [Serializable], [DataContact], [MessageContract] or someting else?. Consider that I have some [XmlArray] atributes in my custom classes as well. And if I add [DataContract] atribute to my ErrorMessage class do I have to add same attribute to ErrorMsgElement as following?

[DataContract]
[Serializable]
public class ErrorMsgElement
{
    ...
}

[DataContract]
[Serializable]
[XmlRoot("Root")]
public class ErrorMessage
{
    ...

    [DataMember]
    [XmlElement("ErrorMsg")]
    public ErrorMsgElement msgElent { get; set; }
}

All answers are well appreciated. Thanks in advance.

Upvotes: 0

Views: 1444

Answers (1)

Harry89pl
Harry89pl

Reputation: 2435

in wcf [DataContact] and DataContractSerializer are recommended for what do you want to do. But you can also use XmlSerializer as well it's really only your choice(using first or second don't making diffrent for performance of your application).

Edit:

When you adding DataContract attribute to your class than you don't have to add Serializable attribute too the same class DataContract is equal to Serializable

check this for answer about nested DataContracts

Upvotes: 1

Related Questions