Deserialize XML data into object

由于工作的需要,自己写了一个exmaple on 反序列 xml data 成 自定义的一个object:


主体:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;


namespace NextLabs.RemindwithEmail
{
class Program
{
static void Main(string[] args)
{
emailcollection emails = null;
string path = Directory.GetCurrentDirectory().ToString() + @"\" + "EmailInformation.xml";


XmlSerializer serializer = new XmlSerializer(typeof(emailcollection));
StreamReader reader = new StreamReader(path);
emails = (emailcollection)serializer.Deserialize(reader);
reader.Close();


foreach (email myemail in emails)
{
Console.WriteLine(myemail.smtp);
Console.WriteLine(myemail.to);
Console.WriteLine(myemail.port);
Console.WriteLine(myemail.subject);
}
}
}
}


辅助:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Collections;


namespace NextLabs.RemindwithEmail
{
[Serializable]
public class email
{
[System.Xml.Serialization.XmlElement("smtp")]
public string smtp { get; set; }


[System.Xml.Serialization.XmlElement("port")]
public string port { get; set; }


[System.Xml.Serialization.XmlElement("to")]
public string to { get; set; }


[System.Xml.Serialization.XmlElement("subject")]
public string subject { get; set; }
}


[Serializable]
[System.Xml.Serialization.XmlRoot("emailcollection")]
public class emailcollection : IEnumerable
{
[System.Xml.Serialization.XmlArray("emailcollection")]
[System.Xml.Serialization.XmlArrayItem("email",typeof(email))]
public List<email> emails
{
get
{
return _emails;
}
set
{
_emails = value;
}
}


private List<email> _emails;


public void Add(object o)
{
if (_emails == null)
_emails = new List<email>();


_emails.Add(o as email);

}


public emailEnum GetEnumerator()
{
return new emailEnum(emails);
}


IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator) GetEnumerator();
}
}


public class emailEnum : IEnumerator
{
public List<email> _emailcollection;


int postion = -1;


public emailEnum(List<email> list)
{
_emailcollection = list;
}


public void Reset()
{
postion = -1;
}


public bool MoveNext()
{
postion++;
return (postion < _emailcollection.Count);
}


object IEnumerator.Current
{
get
{
return Current;
}
}


public email Current
{
get
{
try
{
return _emailcollection[postion];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}
}


在这里我遇到几个问题:

1. 反序列时候XmlArray("emailcollection") 对应的变量不能被定义为 List, 只能定义为 array。 其实是错的。 可以被定义为 list。

[System.Xml.Serialization.XmlArray("emailcollection")]
[System.Xml.Serialization.XmlArrayItem("email",typeof(email))]
public List<email> emails


2. 自定义的collection 要能使用foreach statoment,必须实现Getenumerator() 方法


微软解释

Type: System.Collections.IEnumerator
An IEnumeratorobject that can be used to iterate through the collection.

Theforeachstatement of the C# language (For Eachin Visual Basic) hides the complexity of the enumerators. Therefore,usingforeachis recommended,instead of directly manipulating the enumerator.

Enumerators can be used to read the data in the collection,but they cannot be used to modify the underlying collection.

Initially,the enumerator is positioned before the first element in the collection. TheResetmethod also brings the enumerator back to this position. At this position,theCurrentproperty is undefined. Therefore,you must call theMoveNextmethod to advance the enumerator to the first element of the collection before reading the value ofCurrent.

Currentreturns the same object until eitherMoveNextorResetis called.MoveNextsetsCurrentto the next element.

IfMoveNextpasses the end of the collection,the enumerator is positioned after the last element in the collection andMoveNextreturnsfalse. When the enumerator is at this position,subsequent calls toMoveNextalso returnfalse. If the last call toMoveNextreturnsfalse,Currentis undefined. To setCurrentto the first element of the collection again,you can callResetfollowed byMoveNext.

An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection,such as adding,modifying,or deleting elements,the enumerator is irrecoverably invalidated and its behavior is undefined.

The enumerator does not have exclusive access to the collection; therefore,enumerating through a collection is intrinsically not a thread-safe procedure. To guarantee thread safety during enumeration,you can lock the collection during the entire enumeration. To allow the collection to be accessed by multiple threads for reading and writing,you must implement your own synchronization.



3. 反序列后,object 需要被添加。 添加时需要判定当前collection的状态,然后实习add,否则会进入deadlock然后得到stackoverexception

public void Add(object o)
{
if (_emails == null)
_emails = new List<email>();

_emails.Add(o as email); }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇