簡體   English   中英

C#object < - >數據合同序列化/反序列化會添加一些不需要的標記

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM