序列化时未获取 xml 输入值以列出 wcf 服务中的类

Posted

技术标签:

【中文标题】序列化时未获取 xml 输入值以列出 wcf 服务中的类【英文标题】:not getting xml input value to list class in wcf service while serializing 【发布时间】:2021-10-31 21:06:18 【问题描述】:

我在序列化 WCF 服务上的 xml 输入时遇到了获取列表对象类型的问题。我没有得到 Data 类的列表值,它给出的计数值为零。我是 WCF 服务的新手。你能帮帮我吗?

下面是例子:

[DataContract]
public class Item
 
    [DataMember]
    public int Id  get; set; 
    [DataMember]
    public string Name  get; set; 
    [DataMember]
    public List<Data> data  get; set; 


[DataContract]
public class Data

    [DataMember]
    public int dataId  get; set; 
    [DataMember]
    public int dataName  get; set; 
    [DataMember]
    public int dataVolume  get; set; 

并在服务类中序列化xml数据

public Stream Conversion(Stream request)

    XmlSerializer serializer1 = new XmlSerializer(typeof(Item));
    Item item = (Item)serializer1.Deserialize(request);

【问题讨论】:

【参考方案1】:

XmlSerializer 允许列表是同名元素的序列,例如:

[XmlRoot("Item", Namespace="")]
public class Item

    public int Id  get; set; 

    public string Name  get; set; 

    [XmlElement("Data")]
    public List<Data> Data  get; set; 


public class Data

    [DataMember]
    public int dataId  get; set; 
    [DataMember]
    public string dataName  get; set; 
    [DataMember]
    public int dataVolume  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 item = new Item  Id= 1, Name = "The Car", Data = new[]  new Data  dataId = 1, dataName = "Vovol",dataVolume = 135 , new Data  dataId = 2, dataName = "Cadillac",dataVolume = 136  .ToList() ;
var xml = item.GetXml();

Debug.WriteLine(xml);

以下 xml 用于您的课程:

<Item>
    <Id>1</Id>
    <Name>The Car</Name>
    <Data>
        <dataId>1</dataId>
        <dataName>Vovol</dataName>
        <dataVolume>135</dataVolume>
    </Data>
    <Data>
        <dataId>2</dataId>
        <dataName>Cadillac</dataName>
        <dataVolume>136</dataVolume>
    </Data>
</Item>

【讨论】:

感谢先生分享信息。它的工作。酷

以上是关于序列化时未获取 xml 输入值以列出 wcf 服务中的类的主要内容,如果未能解决你的问题,请参考以下文章

跨 WCF Web 服务请求序列化通用 XML 数据

当 url 段为 json 字符串时,访问 WCF Rest 服务 (WebGet) 时未找到 404

在 C# 中为 WCF 服务反序列化简单的 XML 数组对象

C# Restful WCF 服务。无法在帖子正文中反序列化 XML

如何从 WCF 打印数组的值以形成标签?

如何自定义 WCF XML 序列化