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>