Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对象<-&燃气轮机;数据协定序列化/反序列化会添加一些不需要的标记_C#_Xml_Serialization_Datacontractserializer - Fatal编程技术网

C#对象<-&燃气轮机;数据协定序列化/反序列化会添加一些不需要的标记

C#对象<-&燃气轮机;数据协定序列化/反序列化会添加一些不需要的标记,c#,xml,serialization,datacontractserializer,C#,Xml,Serialization,Datacontractserializer,我面临着一个恼人的情况,我的序列化/反序列化没有达到预期效果 我想要 <OuterClass> <Assets> <Asset>Asset_A</Asset> <Asset>Asset_B</Asset> </Assets> ... </OuterClass> 因此,您看到的是外部类,这与您的AssetClass列表相符 然后每个,最后每个AssetClass.

我面临着一个恼人的情况,我的序列化/反序列化没有达到预期效果

我想要

<OuterClass>
  <Assets>
      <Asset>Asset_A</Asset>
      <Asset>Asset_B</Asset>
  </Assets>
  ...
</OuterClass> 

因此,您看到的是外部类,这与您的AssetClass列表相符 然后每个,最后每个AssetClass.Asset属性被序列化为另一个标记


如果不自己实现序列化(我相信是通过ISerialize),您就无法获得所需的XML输出。

您需要将
列表资产{get;set;}
更改为
列表资产{get;set;}
,并使用
xmlement
属性指定子元素名称,并对类进行一些更改:

public class OuterClass
{
    [DataMember(Name = "Assets", Order = 10),
    XmlElement(ElementName = "Asset")]
    public List<string> Assets { get; set; }
    ...
    //[DataContract(Name = "Asset", Namespace = "")]
    //public class AssetClass
    //{
    //  [DataMember(Name = "Asset", Order = 10)]
    //  public string Asset { get; set; }
    //  ...
    //} 
}
公共类外部类
{
[DataMember(Name=“Assets”,Order=10),
XmlElement(ElementName=“资产”)]
公共列表资产{get;set;}
...
//[DataContract(Name=“Asset”,Namespace=”“)]
//公共类资产类
//{
//[DataMember(Name=“Asset”,Order=10)]
//公共字符串资产{get;set;}
//  ...
//} 
}

希望这有帮助

您可以使用
XmlSerializer
而不是
DataContractSerializer
,这样您就可以更好地控制
XML
好了,所以我可以通过修改类标记和实际的序列化/反序列化代码来解决.NET序列化的奇怪之处。虽然答案并没有按原样起作用,但多亏了托马斯和穆尼姆的提示,让我在一些实验后走上了正确的道路

序列化更改

将DataContractSerializer替换为XmlSerializer。这太糟糕了,因为它慢了很多(500%):(…)

类标记更改

public class OuterClass
{
    [DataMember(Name = "Assets", Order = 10)]
    public ListAssetClass Assets { get; set; }
    ...

    //[DataContract(Name = "Asset123", Namespace = "")]
    public class ListAssetClass
    {
        [XmlElement(ElementName = "Asset")]
        public List<string> Assets { get; set; }
        ...
    }
}
公共类外部类
{
[DataMember(Name=“Assets”,Order=10)]
公共ListAssetClass资产{get;set;}
...
//[DataContract(Name=“Asset123”,Namespace=”“)]
公共类ListAssetClass
{
[XmlElement(ElementName=“资产”)]
公共列表资产{get;set;}
...
}
}
现在给我

<Assets>
  <Asset>Asset One</Asset>
  <Asset>Asset Two</Asset>
</Assets>

资产一
资产二

<>我惊讶于框架序列化/反序列化是如此的扭曲和缓慢。有时我可能需要寻找一个外部库。

你是否考虑过使用二进制序列化?我也认为它是一个子节点,因为它是嵌套类。ze.@Zhanger,我正在进行二进制序列化(事实上我正在对它进行三次转换:()。让我把它作为一个非嵌套类munim进行检查,这样我就得到了">资产一资产二我还用序列化/反序列化片段更新了我的原始帖子。有什么想法吗?谢谢!另外,如果我使用完全相同的数据契约从DataContractSerializer切换到XmlSerializer,我现在得到资产一资产二和标记之间的标记现在丢失了!这很有趣…我做到了以及Munim的建议(见下文)。这样,我就从重复标记变成了单个标记,但我的外部标记丢失了。如果您有任何想法,我将不胜感激……XmlSerializer非常古老。您应该尝试让数据契约序列化为您服务,否则就使用LINQ to XML。
public class OuterClass
{
    [DataMember(Name = "Assets", Order = 10),
    XmlElement(ElementName = "Asset")]
    public List<string> Assets { get; set; }
    ...
    //[DataContract(Name = "Asset", Namespace = "")]
    //public class AssetClass
    //{
    //  [DataMember(Name = "Asset", Order = 10)]
    //  public string Asset { get; set; }
    //  ...
    //} 
}
public string ToXmlString(OuterClass AssetsWrapper)
{
    XmlSerializer ser = new XmlSerializer(typeof(OuterClass));            
    MemoryStream memStream = new MemoryStream();

    // Convert object -> stream -> byte[] -> string (whew!)
    ser.WriteObject(memStream, AssetsWrapper);
    byte[] AssetsWrapperByte = memStream.ToArray();
    return Encoding.UTF8.GetString(AssetsWrapperByte);
}
public class OuterClass
{
    [DataMember(Name = "Assets", Order = 10)]
    public ListAssetClass Assets { get; set; }
    ...

    //[DataContract(Name = "Asset123", Namespace = "")]
    public class ListAssetClass
    {
        [XmlElement(ElementName = "Asset")]
        public List<string> Assets { get; set; }
        ...
    }
}
<Assets>
  <Asset>Asset One</Asset>
  <Asset>Asset Two</Asset>
</Assets>