c# - WCF 中的 Xml 数据未正确序列化

标签 c# wcf rest

我一直在开发一个 wcf 服务。这是我在服务中定义的 DataContract。这是服务将由 android 设备用户使用,数据将以 xml 的形式在服务方法中传递。

 [DataContract(Namespace = "")]
    public class Employee
    {
        [DataMember]
        public int ID { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public List<City> city { get; set; }
    }
    [DataContract]
    public class City
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string CityName { get; set; }
    }

下面是我定义的servicecontract

 [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "/SaveData/New")]
        void SaveData(Employee emp);
    }

现在这个服务的实现代码如下:

 public void SaveData(Employee emp)
        {
            Employee obj = emp;
            DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));

            using (Stream stream = new FileStream(@"D:\file.xml", FileMode.Create, FileAccess.Write))
            {
                using (XmlDictionaryWriter writer =
                    XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8))
                {
                    writer.WriteStartDocument();
                    dcs.WriteObject(writer, obj);
                }
            }

当我使用 fiddler 发送 xml 格式的数据时,它没有被正确解析。这是我使用 fiddler 传递给方法的内容:

<Employee>
<ID>1</ID>
<Name>Nitin Singh</Name>
<City>
<Id>1<Id>
<CityName>New Delhi<CityName>
<City>
</Employee>

它正在渲染的输出如下:-

<?xml version="1.0" encoding="utf-8"?><Employee xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ID>1</ID><Name>Nitin Singh</Name><city i:nil="true" xmlns:a="http://schemas.datacontract.org/2004/07/SampleService"/></Employee>

我希望 city valus 也应该存在于其中,但它没有发生在这里。请帮我弄清楚这一点。谢谢

最佳答案

XmlSerializer 允许您将列表“展平”为一系列同名元素,如下所示:

[XmlRoot("Employee", Namespace="")]
public class Employee
{
    public int ID { get; set; }

    public string Name { get; set; }

    [XmlElement("City")]
    public List<City> City { get; set; }
}

public class City
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string CityName { get; set; }
}

并且,要使用它:

public static class XmlSerializationHelper
{
    public static string GetXml<T>(T obj, XmlSerializer serializer, bool omitStandardNamespaces)
    {
        using (var textWriter = new StringWriter())
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;        // For cosmetic purposes.
            settings.IndentChars = "    "; // For cosmetic purposes.
            using (var xmlWriter = XmlWriter.Create(textWriter, settings))
            {
                if (omitStandardNamespaces)
                {
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines.
                    serializer.Serialize(xmlWriter, obj, ns);
                }
                else
                {
                    serializer.Serialize(xmlWriter, obj);
                }
            }
            return textWriter.ToString();
        }
    }

    public static string GetXml<T>(this T obj, bool omitNamespace)
    {
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        return GetXml(obj, serializer, omitNamespace);
    }

    public static string GetXml<T>(this T obj)
    {
        return GetXml(obj, false);
    }
}

测试代码:

    var employee = new Employee { Name = "Nitin Singh", ID = 1, City = new[] { new City { CityName = "New Delhi", Id = 1 }, new City { CityName = "Bangalore", Id = 2 } }.ToList() };
    var xml = employee.GetXml();

    Debug.WriteLine(xml);

对于您的类,这会生成以下 XML:

<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ID>1</ID>
    <Name>Nitin Singh</Name>
    <City>
        <Id>1</Id>
        <CityName>New Delhi</CityName>
    </City>
    <City>
        <Id>2</Id>
        <CityName>Bangalore</CityName>
    </City>
</Employee>

这是你想要的吗?这会将 XML 写入字符串以用于测试目的。写入文件的说明在这里:How to: Write Object Data to an XML File .

(您在数据契约(Contract)中犯了几个小错误 -- public List<City> city 应该是 public List<City> Citypublic class City 需要 [DataContract(Namespace = "")] 。但是,结果列表会深两层。)

关于c# - WCF 中的 Xml 数据未正确序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27792004/

相关文章:

iphone - 从 iPhone 将图像和个人资料详细信息发布到服务器

c# - RestSharp 线程安全吗?

c# - 将 .asmx Web 服务作为 Windows 服务运行

c# - 如何在 C# 中的二维数组中获取内部数组的长度?

c# - Entity Framework 在工作量大的情况下抛出意外异常

c# - WCF 有多少种契约类型?

.net - 在无状态 REST Web 服务环境中实现验证码

rest - 在没有实体 ID 的 REST API 中删除最佳实践

c# - 如何在 Visual Studio Code 中为大型 C# 文件启用语法高亮显示?

c# - silverlight 3.0与winforms的通信