2017-08-16 7 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に設定してください。このように、シリアライザはisEnabledプロパティをシリアル化する必要があることを知っています。 IsEnabledSpecifiedプロパティは、シリアライザにとって特別な意味を持ちます.XmlIgnore属性のために直列化されませんが、xmlペイロード内に関連するxml要素が表示されます(「指定」プロパティはtrueに設定されます) "Specified"プロパティをfalseに設定)。