2013-07-09 31 views
1

我希望能找到您的解決方案。我需要的是將ValidatorList類對象序列化爲一個xml文檔。這個怎麼做?如何將類對象序列化到xml文檔

我想是這樣的:

XmlSerializer _serializer = new XmlSerializer(list); 

但我不知道如何使XML的輸出有幾個類別列表。

C#

_list= new ListVal(); 
Type _type = typeof(ras); 

_list.Add(new RequiredField 
        { 
         Property = _type.GetProperty("CustRef") 
        }.Add(new AsciiVal())); 
_list.Add(new RequiredField 
        { 
        Property = _type.GetProperty("ctr") 
        }.Add(new StringLengthVal 
          { 
          min= 3, 
          max= 3 
          })); 

[Serializable] 
public class Field 
{ 
public Field Next 
{ 
    get; 
    set; 
} 

public Field TypeName 
{ 
    get; 
    set; 
} 

    public Field PropertyName 
    { 
    get; 
    set; 
} 
} 

public class RequiredField : Field 
{ 
//TODO 
} 

public class AsciiVal: Field 
{ 
//TODO 
    } 

public class StringLengthVal: Field 
{ 
//TODO 
} 

public class ListVal: List<Field> 
{ 
//TODO 
    } 
+0

僅供參考將對象轉換爲數據流(如Xml)的過程是*序列化*。 *反序列化*是另一種方式。我已經用正確的短語更新了你的問題,以使其更清晰 – Jamiec

回答

1

我有東西接近,但不完全的Xml你想要的。實際上,我認爲你會發現下面生成的Xml比你擁有的更有意義。

爲了幫助您入門,您可以使用System.Xml.Serialization namespace中的屬性控制序列化和反序列化。一些有用的例子來閱讀了關於是

於是我嘲笑了其中一些符合您自己的代碼。注意添加了一些屬性來指示序列化程序如何佈局Xml。

[XmlInclude(typeof(AsciiValidator))] 
[XmlInclude(typeof(RequiredValidator))] 
[XmlInclude(typeof(StringLengthValidator))] 
public class FieldValidator 
{ 
    [XmlElement("Next")] 
    public FieldValidator Next 
    { 
    get; 
    set; 
    } 

    [XmlElement("PropertyName")] 
    public string PropertyName 
    { 
    get; 
    set; 
    } 
} 

public class AsciiValidator: FieldValidator 
{ 
} 

public class RequiredValidator: FieldValidator 
{ 
} 

public class StringLengthValidator: FieldValidator 
{ 
    [XmlElement] 
    public int MinLength{get;set;} 
    [XmlElement] 
    public int MaxLength{get;set;} 
} 

[XmlRoot("ValidatorList")] 
public class ValidatorList : List<FieldValidator> 
{  
} 

興趣點;每一個類繼承FieldValidator必須加到用XmlIncludeAttribute所以串行知道如何處理他們做)

然後,我創建了一個例子對象映射已知類型的列表:

var test = new ValidatorList(); 
test.Add(
      new RequiredValidator() 
       { 
        PropertyName="CustRef", 
        Next = new AsciiValidator() 
       });    
test.Add(
      new RequiredValidator() 
       { 
        PropertyName="CurrencyIndicator", 
         Next = new StringLengthValidator(){ 
          MinLength=3, 
          MaxLength = 10 
         } 
       }); 

最後我告訴序列化序列化(並把結果輸出到控制檯)

var ser = new XmlSerializer(typeof(ValidatorList)); 
ser.Serialize(Console.Out,test); 

這是結果:

<?xml version="1.0" encoding="utf-8"?> 
<ValidatorList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <FieldValidator xsi:type="RequiredValidator"> 
    <Next xsi:type="AsciiValidator" /> 
    <PropertyName>CustRef</PropertyName> 
    </FieldValidator> 
    <FieldValidator xsi:type="RequiredValidator"> 
    <Next xsi:type="StringLengthValidator"> 
     <MinLength>3</MinLength> 
     <MaxLength>10</MaxLength> 
    </Next> 
    <PropertyName>CurrencyIndicator</PropertyName> 
    </FieldValidator> 
</ValidatorList> 

距離你想要的不遠一百萬英里。需要以某種方式輸出某些東西(例如xsi:type告訴序列化程序如何反序列化回到對象圖)。我希望這給你一個好的開始。

這是一個活生生的,工作示例:http://rextester.com/OXPOB95358

反序列化可以通過調用的XmlSerializer的Deserialize方法來完成。

例如,如果你的XML是一個字符串:

var ser = new XmlSerializer(typeof(ValidatorList)); 
var test = "<..../>" // Your Xml 
var xmlReader = XmlReader.Create(new StringReader(test)); 
var validatorList = (ValidatorList)ser.Deserialize(xmlReader); 

有反序列化的許多覆蓋其採取具體取決於該數據流中的現有閱讀器,或者保存到文件不同的輸入。

+0

謝謝,以及如何去除它? – user235973457

+0

通過調用['XmlSerializer'](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx)上的'Deserialize'方法之一 – Jamiec

+0

我試過了 - 它不管用。我想看看你的情況,以便我能理解。非常感謝你的時間:) – user235973457

0

你要裝飾一個包含與KonwnType的_validators方面的階級屬性

[Serializable] 
[KwownType(typeof(RequiredFieldValidator)] 
[KwownType(typeof(AsciValidator)] 
public class MySerialisableClass 
0

我有幾個SO答案,詳細說明如何使用XML序列化對象。我將在下面提供鏈接。

但是,由於您正在尋找一個相當簡單的對象序列化,因此您可能需要閱讀DataContractSerializer。它比舊的.NET 1.x XML序列化複雜得多。

這裏的SO答案列表:

即使許多這些都與XML序列化和命名空間的事,它們包含序列化a的完整示例n對象使用.NET 1.x XML序列化的XML。