NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)

首先,来看一个简单的例子,其在PC和PDA上均可以顺利的序列化和反序列化。

NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三) namespace  RFID.ReaderProxy
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
{
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    [System.Xml.Serialization.XmlRootAttribute(Namespace 
= "urn:epcglobal:rp:xsd:1", IsNullable = false)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
public partial class TriggerCommand
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
{
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(Form 
= XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        
public string name;
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"create"typeof(int), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"setHandle"typeof(double), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"fire"typeof(string), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        
public object Item;
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    }

NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)}

在特定测试代码下其序列化后的XML文档如下
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三) <? xml version="1.0" ?>
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
< ns:TriggerCommand  xmlns:ns ="urn:epcglobal:rp:xsd:1" >
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)  
< name > hello </ name >
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)  
< setHandle > 123.456 </ setHandle >
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
</ ns:TriggerCommand >

这个类中的成员实际上对应这XSD中的choice,当choice中的选项具有不同的类型和不同的名称时(如上例),XmlSerialize会自动识别数据的类型,仅需一个object类型的字段即可,程序可以强制对item进行类型转换。

下面根据我们的扩展性和兼容性需要,处理XSD中的any, 修改后的代码如下:其中添加了[XmlAnyElementAttribute()]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三) namespace  RFID.ReaderProxy
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
{
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    [System.Xml.Serialization.XmlRootAttribute(Namespace 
= "urn:epcglobal:rp:xsd:1", IsNullable = false)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
public partial class TriggerCommand
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
{
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(Form 
= XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        
public string name;
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlAnyElementAttribute()]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"create"typeof(int), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"setHandle"typeof(double), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"fire"typeof(string), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        
public object Item;
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    }

NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)}

在PC下面测试时,可以输出相同的XML文档,但在PDA上测试时,创建XmlSerializer的时候得到如下的异常:
You need to add XmlChoiceIdentifierAttribute to the 'Item' member.

可能是在NETCF下面无法区分XmlElement和其它的类型吧,从而破坏了“当choice中的选项具有不同的类型和不同的名称时”约束,因此尝试性的加入自定义枚举类,代码如下:
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三) namespace  RFID.ReaderProxy
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
{
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    [System.Xml.Serialization.XmlRootAttribute(Namespace 
= "urn:epcglobal:rp:xsd:1", IsNullable = false)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
public partial class TriggerCommand
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
{
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(Form 
= XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        
public string name;
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlAnyElementAttribute()]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"create"typeof(int), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"setHandle"typeof(double), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlElementAttribute(
"fire"typeof(string), Form = XmlSchemaForm.Qualified)]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlChoiceIdentifierAttribute(
"ItemElementName")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        
public object Item;
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlIgnoreAttribute()]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        
public TriggerCommandItemChoiceType ItemElementName;
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    }

NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
public enum TriggerCommandItemChoiceType
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    
{
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [System.Xml.Serialization.XmlEnumAttribute(
"##any:")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        Item,
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlEnumAttribute(Name 
= "create")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        create,
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlEnumAttribute(Name 
= "setHandle")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        setHandle,
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        [XmlEnumAttribute(Name 
= "fire")]
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)        fire
NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)    }

NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)}

OK,现在PC和PDA上均可以获得相同的XML输出了。

至此,复杂对象在NETCF中的序列化所遇到的问题基本上解决了,当然,要处理EPC中复杂的XSD并让其在NETCF中正常工作,还需要很多额外的工作,后面等总结出来后再发上来。

你可能感兴趣的:(Serialize)