[英]C# object<->Data Contract serialization/deserialization adds some unwanted tags
我面臨一個令人討厭的情況,我的序列化/反序列化不像預期的那樣。
我想要
<OuterClass>
<Assets>
<Asset>Asset_A</Asset>
<Asset>Asset_B</Asset>
</Assets>
...
</OuterClass>
但我越來越
<OuterClass>
<Assets>
<Asset>
<Asset>Asset_A</Asset>
</Asset>
<Asset>
<Asset>Asset_B</Asset>
</Asset>
</Assets>
...
</OuterClass>
如您所見,資產標簽出現了兩次。
這樣做的代碼是..
public class OuterClass
{
[DataMember(Name = "Assets", Order = 10)]
public List<AssetClass> Assets { get; set; }
...
[DataContract(Name = "Asset", Namespace = "")]
public class AssetClass
{
[DataMember(Name = "Asset", Order = 10)]
public string Asset { get; set; }
...
}
}
我知道我在代碼中也列出了兩次'Name =“Asset”',但是如果我把它們中的任何一個拿出來,那么框架會在里面添加它自己的名字。 我以某種方式懷疑我需要更改代碼本身的結構,但不確定如何執行此操作。
(編輯)我正在使用框架內序列化/反序列化幫助器。 代碼是(簡化):
public string ToXmlString(OuterClass AssetsWrapper)
{
DataContractSerializer ser = new DataContractSerializer(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);
}
因此,您所看到的是OuterClass,然后依次對應於AssetClass列表和each,最后將每個AssetClass.Asset屬性序列化為另一個標記。
如果沒有自己實現序列化(通過ISerialize,我相信),您將無法獲得所需的XML輸出。
您需要更改List<AssetClass> Assets { get; set; }
List<AssetClass> Assets { get; set; }
List<AssetClass> Assets { get; set; }
List<string> Assets { get; set; }
List<string> Assets { get; set; }
List<string> Assets { get; set; }
,並給予與子元素名稱XmlElement
屬性,並讓你的類中的一些變化:
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; }
// ...
//}
}
希望這可以幫助!
您可以使用XmlSerializer
而不是DataContractSerializer
,這將使您可以更好地控制XML
。
好了,我可以用這兩個類的標記,以及實際的序列化/反串行化代碼修修補補左右來解決這個.net序列怪事。 盡管答案並不能按原樣起作用,但要感謝托馬斯(Thomas)和穆尼姆(Munim)給出的提示,這些提示使我在進行了一些實驗后走了正確的道路。
序列化更改
用XmlSerializer替換了DataContractSerializer。 這完全糟透了,因為它慢了很多(500%):( ...( 這里的性能 )
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>
我很驚訝框架序列化/反序列化是如此扭曲和緩慢。 我可能有時需要尋找一個外部庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.