2017-08-16 137 views
0

XmlIgnoreAttribute忽略屬性的IsEnabledisEnabledFieldSpecified,因爲它們具有相似的名稱。如何解決這個問題?因爲我的財產secondCar我有IsEnabled=false但我期望得到IsEnabled=true。也許這是重複的問題,但我無法在堆棧上找到答案。C#XmlIgnoreAttribute類似的屬性名稱

class Program 
{ 
    static void Main(string[] args) 
    { 
     Car firstCar = new Car() { IsEnabled = true }; 
     Car secondCar = new Car() { IsEnabled = false }; 

     secondCar = XmlUtility.XmlStr2Obj<Car>(XmlUtility.Obj2XmlStr(firstCar)); 

    } 
} 

[Serializable] 
public class Car 
{ 
    private bool isEnabledFieldSpecified; 

    private bool isEnabledField; 

    [XmlAttributeAttribute()] 
    public bool IsEnabled 
    { 
     get 
     { 
      return this.isEnabledField; 
     } 
     set 
     { 
      this.isEnabledField = value; 
     } 
    } 

    [XmlIgnoreAttribute()] 
    public bool IsEnabledSpecified 
    { 
     get 
     { 
      return this.isEnabledFieldSpecified; 
     } 
     set 
     { 
      this.isEnabledFieldSpecified = value; 
     } 
    } 
} 

namespace Utils 
{ 
    public class XmlUtility 
    { 
     public static string Obj2XmlStr(object obj, string nameSpace) 
     { 
      if (obj == null) return string.Empty; 
      XmlSerializer sr = SerializerCache.GetSerializer(obj.GetType()); 

      StringBuilder sb = new StringBuilder(); 
      StringWriter w = new StringWriter(sb, CultureInfo.InvariantCulture); 

      sr.Serialize(
       w, 
       obj, 
       new XmlSerializerNamespaces(
       new[] 
        { 
        new XmlQualifiedName("", nameSpace) 
        } 
       )); 
      return sb.ToString(); 
     } 

     public static string Obj2XmlStr(object obj) 
     { 
      if (obj == null) return string.Empty; 
      XmlSerializer sr = SerializerCache.GetSerializer(obj.GetType()); 

      StringBuilder sb = new StringBuilder(); 
      StringWriter w = new StringWriter(sb, CultureInfo.InvariantCulture); 

      sr.Serialize(
       w, 
       obj, 
       new XmlSerializerNamespaces(new[] { new XmlQualifiedName(string.Empty) })); 

      return sb.ToString(); 
     } 

     public static T XmlStr2Obj<T>(string xml) 
     { 
      if (xml == null) return default(T); 
      if (xml == string.Empty) return (T)Activator.CreateInstance(typeof(T)); 

      StringReader reader = new StringReader(xml); 
      XmlSerializer sr = SerializerCache.GetSerializer(typeof(T)); 
      return (T)sr.Deserialize(reader); 
     } 

     public static XmlElement XmlStr2XmlDom(string xml) 
     { 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xml); 
      return doc.DocumentElement; 
     } 

     public static XmlElement Obj2XmlDom(object obj, string nameSpace) 
     { 
      return XmlStr2XmlDom(Obj2XmlStr(obj, nameSpace)); 
     } 
    } 

    internal class SerializerCache 
    { 
     private static readonly Hashtable Hash = new Hashtable(); 
     public static XmlSerializer GetSerializer(Type type) 
     { 
      XmlSerializer res; 
      lock (Hash) 
      { 
       res = Hash[type.FullName] as XmlSerializer; 
       if (res == null) 
       { 
        res = new XmlSerializer(type); 
        Hash[type.FullName] = res; 
       } 
      } 
      return res; 
     } 
    } 
} 
+0

如果註釋掉[[XmlAttributeAttribute()]'會發生什麼? – mjwills

+0

@mjwills,如果我評論[XmlAttributeAttribute()]結果我有IsEnabled = false。 – A191919

+0

@mjwills,嘗試將IsEnabledSpecified重命名爲IsTEnabledSpecified。沒有任何屬性更改。 – A191919

回答

-1

嘗試在兩個對象中將IsEnabledSpecified屬性設置爲true。像這樣:

Car firstCar = new Car() { IsEnabled = true, IsEnabledSpecified = true }; 
Car secondCar = new Car() { IsEnabled = false, IsEnabledSpecified = true }; 

這樣serializer會知道,那isEnabled屬性應該是序列化的。 IsEnabledSpecified屬性對序列化程序有特殊意義:它不會自行序列化(因爲XmlIgnore屬性),但它控制與xml有效內容相關的xml元素是否出現(「Specified」屬性設置爲true)或不「指定」屬性設置爲false)。