【问题标题】:Serialization problem in monotouchmonotouch中的序列化问题
【发布时间】:2011-01-29 10:26:46
【问题描述】:

我在反序列化时遇到了一个奇怪的问题,想知道是否有人可以对此有所了解。对不起,粗略的代码,但这只是一个原型。

基本上我正在尝试序列化和反序列化一个简单的类:

[Serializable]

 [Preserve(AllMembers=true)]

 public class School

 {

  public School ()

  {

  }

   public string est_name{get; set;}

             public string postcode{get; set;}

          public string phase {get; set;}

            public string head_name{get; set;}

          public string urn {get; set;}

          public long distance{get; set;}

           public string coord{get; set;}

           public string gender{get; set;}

          public int totpup{get; set;}

   public int totelig{get; set;}

   public float pmattest14p{get; set;}

   public float pmattest15{get; set;}

      public float pengtest14p{get; set;}

      public float pengtest15{get; set;}

                    public float apsengmattest{get; set;

         }

序列化代码如下,使用School[]作为T,它是一个泛型类的方法:

public void serializesample(T sample)

  {

        XmlSerializer serializer = new XmlSerializer(typeof(T));

        string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Sample2.xml")      Stream st = new FileStream(path, FileMode.OpenOrCreate);

        XmlWriter w = new XmlTextWriter(st, Encoding.UTF8);

                  serializer.Serialize(w, sample);   

        st.Flush(); 

                st.Close();  

            }

生成以下 XML 文件:

<?xml version="1.0" encoding="utf-8"?>

<ArrayOfSchool xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<School><est_name>testName</est_name><postcode>N7 0NA</postcode><head_name>thedude</head_name><distance>0</distance><gender>mixed</gender><totpup>0</totpup><totelig>0</totelig><pmattest14p>0</pmattest14p><pmattest15>0</pmattest15><pengtest14p>5</pengtest14p><pengtest15>3</pengtest15><apsengmattest>0</apsengmattest></School><School><est_name>testName2</est_name><postcode>N7 4NA</postcode><head_name>thedude</head_name><distance>0</distance><gender>mixed2</gender><totpup>0</totpup><totelig>0</totelig><pmattest14p>0</pmattest14p><pmattest15>0</pmattest15><pengtest14p>5</pengtest14p><pengtest15>3</pengtest15><apsengmattest>0</apsengmattest></School></ArrayOfSchool> 

反序列化代码如下,其中School[]为T:

private T ReadObject(XmlReader reader)
  {

   XmlSerializer serializer = new XmlSerializer(typeof(T));
   return (T)serializer.Deserialize(reader);   
  }

XmlReader r = XmlReader.Create(new     FileStream(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Sample2.xml"), FileMode.Open));

e.responseObject = ReadObject(r);

我在最后列出的行“responseObject = ReadObject(r);”处不断收到以下异常:

System.InvalidOperationException:XML 文档中存在错误。 ---> System.InvalidOperationException:(未知)不是预期的 在 System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot (System.Xml.Serialization.XmlTypeMapping rootMap) [0x00050] 在 /Developer/MonoTouch/Source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs :182 在 System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot () [0x00028] 在 /Developer/MonoTouch/Source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs:87 在 System.Xml.Serialization.XmlSerializer.Deserialize(System.Xml.Serialization.XmlSerializationReader 阅读器)[0x0001c] 在 /Developer/MonoTouch/Source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializer.cs :361 --- 内部异常堆栈跟踪结束 --- 在 System.Xml.Serialization.XmlSerializer.Deserialize(System.Xml.Serialization.XmlSerializationReader 阅读器)[0x00061] 在 /Developer/MonoTouch/Source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializer.cs :366 在 System.Xml.Serialization.XmlSerializer.Deserialize (System.Xml.XmlReader xmlReader) [0x0002c] 在 /Developer/MonoTouch/Source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializer.cs:350 在 Burnspeed.Utilities.WebRequestHelper1[SchoolFinder_Prototype.School[]].ReadObject (System.Xml.XmlReader stream) [0x00010] in /Users/Khalil/Desktop/Monotouch Utility/Burnspeed.Utilities/Burnspeed.Utilities/WebRequestHelper.cs:201 at Burnspeed.Utilities.WebRequestHelper1[SchoolFinder_Prototype.School[]].ProcessHttpResponseAndFire (IAsyncResult iar) [0x000ae] 在 /Users/Khalil/Desktop/Monotouch Utility/Burnspeed.Utilities/Burnspeed.Utilities/WebRequestHelper.cs:156

【问题讨论】:

    标签: c# .net xamarin.ios


    【解决方案1】:

    我不完全确定为什么会发生此异常。我尝试了您的代码,只进行了少量修改,它就可以工作。我没有使用 [Preserve(AllMembers=true)],我用 School[] 替换了每个 T(你也这样做了,不是吗?)我替换了行“e.responseObject = ReadObject(r) ”,您的异常发生的地方,通过“School[] newArray = ReadObject(r)”。不想写剩下的代码不修改这些小部分。

    除了用 School[] 替换每个 T,您还可以将方法更改为

        public void serializesample<T>(T sample) {
    
            XmlSerializer serializer = new XmlSerializer(typeof(T));
    
            string path = "G:\\sample.xml";
            Stream st = new FileStream(path, FileMode.OpenOrCreate);
    
            XmlWriter w = new XmlTextWriter(st, Encoding.UTF8);
    
            serializer.Serialize(w, sample);
    
            st.Flush();
    
            st.Close();
    
        }
    
        private T ReadObject<T>(XmlReader reader) {
    
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(reader);
        }
    

    并通过serializesample&lt;School[]&gt;(array)ReadObject&lt;School[]&gt;(r) 给他们打电话。

    我只是不确定您对代码中的 T 到底做了什么,我想问题可能出在某个地方。希望有所帮助,即使如果异常来自 Monotouch [Preserve(AllMembers=true)] 可能无济于事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多