必须与XmlSerializer和WCF一起使用 - DataContract或MessageContract?

时间:2012-06-25 05:44:52

标签: c# wcf xml-serialization

我需要编写WCF服务,将 .xml 文件反序列化为我的自定义calss,然后对该数据执行一些操作。我已经编写了这个应用程序的测试版本,它使用的是控制台而不是WCF。以下是我的代码的样子:

[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; }
}

主要代码

        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

它在控制台应用程序中工作正常。现在我需要在WCF服务中编写相同的逻辑。但我不知道应该使用什么 - [Serializable] [DataContact] [MessageContract] 或其他什么?考虑到我的自定义类中也有一些[XmlArray]属性。如果我将[DataContract]属性添加到我的 ErrorMessage 类,我是否必须将相同的属性添加到 ErrorMsgElement ,如下所示?

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

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

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

所有答案都非常感谢。提前谢谢。

1 个答案:

答案 0 :(得分:1)

wcf [DataContact]DataContractSerializer中的

建议你做什么。但你也可以使用XmlSerializer,这只是你的选择(使用第一个或第二个不会使你的应用程序性能不同)。

修改

当您向班级添加DataContract属性时,您不必添加Serializable属性,同一班级DataContract等于Serializable

选中此处以获取有关nested DataContracts

的答案