• How to serialize an XPO object to XML


    Description

    Can XPO serialize objects to / from an XML file?

    Solution

    XPO 1.x does not include any means for serialization. You can serialize XPO objects using the same approach as you serialize any other objects:

    [C#]
    
    
        XmlAttributes attrs = new XmlAttributes();
        attrs.XmlIgnore = true;
        XmlAttributeOverrides ovr = new XmlAttributeOverrides();
        ovr.Add(typeof(XPCustomObject), "GCRecord", attrs);
        XmlSerializer s = new XmlSerializer(typeof(YourObject), ovr);
    

    It's much easier to implement conversion of persistent objects to XML in XPO 6.x. Here is some sample code for XPO 6.1:

    [C#]
    
    
    public class SerializablePerson : XPObject {
      public SerializablePerson() { }
      public SerializablePerson(Session session) : base(session) { }
      public SerializablePerson(string name, int age)  {
        this.name = name;
        this.age = age;
      }
    
      private string name;
      public string Name {
        get { return name; }
        set { name = value; }
      }
    
      private int age;
      public int Age {
        get { return age; }
        set { age = value; }
      }
    
      private SerializablePerson parent;
      [XmlIgnore] // This would loop, and it's not needed
      [Association("Person-Children")]
      public SerializablePerson Parent {
        get { return parent; }
        set { parent = value; }
      }
    
      [XmlIgnore] // We'll serialize the helper instead
      [Association("Person-Children"), Aggregated]
      public XPCollection<SerializablePerson> Children {
        get { return GetCollection<SerializablePerson>("Children"); }
      }
    
      AssociationXmlSerializationHelper childenSerializationHelper;
      [XmlArray("Children")]
      [XmlArrayItem(typeof(SerializablePerson))] // extend this as necessary
      public AssociationXmlSerializationHelper ChildrenSerializationHelper {
        get {
          if (childenSerializationHelper == null)
            childenSerializationHelper = new AssociationXmlSerializationHelper(Children);
          return childenSerializationHelper;
        }
      }
    }
    
    [TestFixture]
    public class Tests {
      [Test]
      public void Test( ) {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(SerializablePerson));
        TextWriter textWriter = new StringWriter( );
    
        SerializablePerson parent = new SerializablePerson("Willy Webb", 53);
        parent.Children.Add(new SerializablePerson("Billy Blab", 14));
    
        xmlSerializer.Serialize(textWriter, parent);
        string str = textWriter.ToString( );
    
        Console.WriteLine(str);
    
        TextReader textReader = new StringReader(str);
        SerializablePerson loadedParent = (SerializablePerson) xmlSerializer.Deserialize(textReader);
    
        Assert.IsFalse(object.ReferenceEquals(parent, loadedParent));
        Assert.AreEqual(parent.Name, loadedParent.Name);
        Assert.AreEqual(parent.Age, loadedParent.Age);
        Assert.AreEqual(parent.Children.Count, loadedParent.Children.Count);
        Assert.AreEqual(parent.Children[0].Name, loadedParent.Children[0].Name);
        Assert.AreEqual(parent.Children[0].Age, loadedParent.Children[0].Age);
      }
    }
    
  • 相关阅读:
    codeforces 1096 题解
    pkuwc 前的任务计划
    codeforces 1093 题解
    luoguP5068 [Ynoi2015]我回来了
    luoguP5074 Eat the Trees
    二分
    保护
    数数字
    旅行
    すすめ!
  • 原文地址:https://www.cnblogs.com/asyuras/p/698016.html
Copyright © 2020-2023  润新知