XML序列化 - 是否可以以这种方式序列化模型?

时间:2010-02-04 12:05:45

标签: serialization xml-serialization datacontract xmlserializer

我有以下型号:

public class ABaseObject
{
    private Guid id = Guid.NewGuid();

    public ABaseObject()
    {
    }

    public Guid ID { get { return id; } }
}

public class ADerivedObject : ABaseObject
{
    public ADerivedObject()
    {
    }

    public string Name { get; set; }
}

public class AObjectCollection<T>
{
    private List<T> items = new List<T>();

    public AObjectCollection()
    {
    }

    public IEnumerable<T> Items { get { return items; } }
    public void Add(T item)
    {
        items.Add(item);
    }

    public void Save(string filePath)
    {
        FileStream writer = new FileStream(filePath, FileMode.Create);
        DataContractSerializer s = new DataContractSerializer(typeof(T));
        s.WriteObject(writer, this);
        writer.Close();
    }

    public void Load(string filePath)
    {
        FileStream fs = new FileStream(filePath, FileMode.Open);
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        DataContractSerializer ser = new DataContractSerializer(typeof(T));

        // Deserialize the data and read it from the instance.
        T deserializedObj = (T)ser.ReadObject(reader, true);
        reader.Close();
        fs.Close();
    }
}

所以基本上我希望能够做到以下几点:

var der = new ADerivedObject();
der.Name = "Test";
var col = new AObjectCollection<ADerivedObject>();
col.Add(der);
col.Save("C:\MyCollection.xml");
...
var col2 = new AObjectCollection<ADerivedObject>();
col2.Load("C:\MyCollection.xml");

序列化后,它应该类似于:

<Collection>
    <Item>
        <ID></ID>
        <Name></Name>
    </Item>
</Collection>

我玩过DataContracts和XmlSerializer,但我似乎找不到办法。

1 个答案:

答案 0 :(得分:1)

此代码:

public class ABaseObject
{
    public ABaseObject() { }
    public Guid ID { get; set;}
}

[XmlType("Item")]
public class ADerivedObject : ABaseObject
{
    public ADerivedObject() {}
    public string Name { get; set; }
}

[XmlType("Collection")]
public class AObjectCollection<T>
{
    private System.Xml.Serialization.XmlSerializerNamespaces ns;
    private System.Xml.Serialization.XmlSerializer s;

    public AObjectCollection()
    {
        ns= new System.Xml.Serialization.XmlSerializerNamespaces();
        ns.Add( "", "");
        s= new System.Xml.Serialization.XmlSerializer(this.GetType());
        Items = new List<T>();
    }

    public List<T> Items { get; set; }
    public DateTime LastSaved { get;set; }

    public void Add(T item)
    {
        Items.Add(item);
    }

    public void Save(string filePath)
    {
        LastSaved= System.DateTime.Now;
        var xmlws = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };

        using ( var writer = System.Xml.XmlWriter.Create(filePath, xmlws))
        {
            s.Serialize(writer, this, ns);
        }
    }

    public static AObjectCollection<T2> Load<T2>(string filepath)
    {
        AObjectCollection<T2> obj;
        try
        {
            var s= new System.Xml.Serialization.XmlSerializer(typeof(AObjectCollection<T2>));
            using(System.IO.StreamReader reader= System.IO.File.OpenText(filepath))
            {
                obj= (AObjectCollection<T2>) s.Deserialize(reader);
            }
        }
        catch
        {
            obj= new AObjectCollection<T2>();
        }

        return obj;
    }
}

生成此输出:

<Collection>
  <Items>
    <Item>
      <ID>00000000-0000-0000-0000-000000000000</ID>
      <Name>Test</Name>
    </Item>
  </Items>
  <LastSaved>2010-02-04T07:32:05.812-05:00</LastSaved>
</Collection>

有一些方法可以调整XML以删除Collection / Items层。搜索SO以获取其他收集/序列化问题。