2013-05-28 39 views
0

是否允许从[Serializable]属性类过渡到IXmlSerializable类并返回?以下代码按预期序列化,但不会反序列化A的第二个属性(它总是返回null)。包含IXmlSerializable属性的Serializable类无法反序列化?

谢谢!

using System.Xml.Serialization; 
using System.IO; 
using System; 

namespace Serialization 
{ 
    [Serializable] 
    public class A 
    { 
     public B B 
     { 
      get; 
      set; 
     } 

     public string C 
     { 
      get; 
      set; 
     } 
    } 

    public class B : IXmlSerializable 
    { 
     private int _value; 

     public void SetValue(int value) 
     { 
      _value = value; 
     } 

     public int GetValue() 
     { 
      return _value; 
     } 

     public System.Xml.Schema.XmlSchema GetSchema() 
     { 
      return null; 
     } 

     public void ReadXml(System.Xml.XmlReader reader) 
     { 
      int.TryParse(reader.ReadString(), out _value); 
     } 

     public void WriteXml(System.Xml.XmlWriter writer) 
     { 
      writer.WriteString(_value.ToString()); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      A a = new A() {B = new B(), C = "bar"}; 
      a.B.SetValue(1); 

      XmlSerializer serializer = new XmlSerializer(typeof(A)); 
      Stream stream = File.Open("foo.xml", FileMode.Create); 
      serializer.Serialize(stream, a); 
      stream.Close(); 

      stream = File.Open("foo.xml", FileMode.Open); 

      A a1 = serializer.Deserialize(stream) as A; 

      if (a1.B.GetValue() != 1 || a1.C != "bar") 
      { 
       System.Diagnostics.Trace.WriteLine("Failed."); 
      } 
      else 
      { 
       System.Diagnostics.Trace.WriteLine("Succeeded."); 
      }    
     } 

    } 
} 

产生预期的XML:

<?xml version="1.0"?> 
<A xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<B>1</B> 
<C>bar</C> 
</A> 

回答

1

最近我有同样的问题。我认为这是因为“reader.ReadString()”不会自己移动阅读光标。你需要将它移到您完成后读书,喜欢与

public void ReadXml(System.Xml.XmlReader reader) 
{ 
    int.TryParse(reader.ReadString(), out _value); 
    reader.Read(); 
} 

或者你可以使用下面的

public void ReadXml(System.Xml.XmlReader reader) 
{ 
    _value = reader.ReadElementContentAsInt(); 
} 

希望,这应该解决您的问题。

+0

谢谢!与任何一种解决方案完美配合。 – user2149714

相关问题