2011-06-20 5 views
2
public class Warning 
{ 

    public Warning() 
    { 

    } 

    public Warning(String name, List<String> conflictList) 
    { 
     Name = name; 
     ConflictList = conflictList; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 

    public List<String> ConflictList 
    { 
     get; 
     set; 
    } 

    public static Warning ReadXML(string xml) 
    { 
     Warning warning = null; 

     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(Warning)); 
      using (StringReader sr = new StringReader(xml)) 
      { 
       XmlTextReader xtr = new XmlTextReader(sr); 
       warning = (Warning)serializer.Deserialize(xtr); 
       xtr.Close(); 
       sr.Close(); 
      } 
     } 
     catch 
     { 
     } 

     return warning; 
    } 

    public void Save(string filename) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Warning)); 
     using (StreamWriter writer = new StreamWriter(filename)) 
     { 
      serializer.Serialize(writer, this); 
      writer.Close(); 
     } 
    } 
} 

次のXML文字列をデシリアライズすると、NameとConflictListの両方でNULL以外の値が返されます。これはうまく、私は期待しています。xml文字列をオブジェクトにデシリアライズし、欠落しているリスト要素の空のリストを取得します。なぜnullを返さないのですか?

Warning w1 = Warning.ReadXML(
    "<Warning><Name>test warning</Name><ConflictList><string>file1.txt</string></ConflictList></Warning>"); 

w1.Nameは、 "テストの警告" を返し、w1.ConflictListは、私は、次のXML文字列をデシリアライズ場合、w2.Nameはnullを返します。ただし、テキスト "FILE1.TXT"

を含むリストを返し、私は理解していますが、ConflictListは実際に0のカウントを持つリストです。私はそれもnullであると予想しました。どうして?

Warning w2 = Warning.ReadXML("<Warning></Warning>"); 

要素がxml文字列に存在しない場合、w1.ConflictListはnullを返すことがありますが、いつ発生しますか?

答えて

0

xmlに含まれていないと、私はそれを残すことも期待していましたが、私はあなたが言っていることを「そのまま」と[XmlElement(...)]で再現できます。私はを内部的には "の場合"リストアップしていると思います。

私もちょうどgetと怠惰な初期化、すなわち

// note: doesn't work; see answer text 
private List<string> conflictList; 
public List<String> ConflictList 
{ 
    get { return conflictList ?? (conflictList = new List<string>()); } 
} 

を使用して代替構文を試してみましたが、それはまだ、競合データが含まれていない場合でも、このゲッターを呼び出します。 - そして、うるさくしかが指定であることをデータ用に呼び出されます*Specifiedパターンあなたが行うことができ、他に指定されていないそれはデータのために呼び出されませんであること:

// note: doesn't work; see answer text 
[XmlIgnore] 
public bool ConflictListSpecified 
{ 
    get { return ConflictList != null; } 
    set { if (!value) ConflictList = null; } 
} 

に追加の事実そのシリアライゼーションコールバックはXmlSerializerでサポートされておらず、オプションがありません。

私はそれを.NET 2.0に戻してテストしましたが、それと同じように動作します。

関連する問題