public virtual void Save(Data data) {
     actions.Add(data);
 }
        private static void WriteData(Data data, XmlWriter writer) {
            bool isObject = data is ObjectData;
            string tag = isObject ? "naked-object" : "collection";

            writer.WriteStartElement(tag);
            writer.WriteAttributeString("Type", data.ClassName);
            writer.WriteAttributeString("id", EncodedOid(data.Oid));
            writer.WriteAttributeString("user", NakedObjectsContext.Session.UserName);

            string sequenceString = data.Version.AsSequence();
            if (!string.IsNullOrEmpty(sequenceString)) {
                long sequence = Convert.ToInt64(sequenceString, 16);
                writer.WriteAttributeString("ver", "" + Convert.ToString(sequence, 16).ToUpper());
            }
            if (isObject) {
                var objectData = (ObjectData) data;

                for (IEnumerator<string> fields = objectData.Fields(); fields.MoveNext();) {
                    string field = fields.Current;
                    object entry = objectData.GetField(field);

                    if (entry is IOid) {
                        var oid = entry as IOid;
                        Assert.AssertFalse(oid.IsTransient);
                        writer.WriteStartElement("association");
                        writer.WriteAttributeString("field", field);
                        writer.WriteAttributeString("ref", EncodedOid(oid));
                        writer.WriteAttributeString("Type", oid.Specification.FullName);
                        writer.WriteEndElement();
                    }
                    else if (entry is IList<IOid>) {
                        var references = (IList<IOid>) entry;

                        if (references.Count > 0) {
                            writer.WriteStartElement("multiple-association");
                            writer.WriteAttributeString("field", field);
                            foreach (SerialOid oid in references) {
                                Assert.AssertFalse("transient oid", oid, oid.IsTransient);
                                writer.WriteStartElement("element");
                                writer.WriteAttributeString("ref", EncodedOid(oid));
                                writer.WriteAttributeString("Type", oid.Specification.FullName);
                                writer.WriteEndElement();
                            }
                            writer.WriteEndElement();
                        }
                    }
                    else if (entry is ObjectData) {
                        writer.WriteStartElement("inline");
                        writer.WriteAttributeString("field", field);
                        WriteData(entry as ObjectData, writer);
                        writer.WriteEndElement();
                    }
                    else {
                        writer.WriteStartElement("value");
                        writer.WriteAttributeString("field", field);
                        writer.WriteString(entry.ToString());

                        writer.WriteEndElement();
                    }
                }
            }
            else {
                var collection = (CollectionData) data;
                IList<IOid> refs = collection.References();
                foreach (IOid oid in refs) {
                    writer.WriteStartElement("element");
                    writer.WriteAttributeString("ref", EncodedOid(oid));
                    writer.WriteAttributeString("Type", oid.Specification.FullName);
                    writer.WriteEndElement();
                }
            }
            writer.WriteEndElement();
        }
 /// <summary>
 ///     Write out the data for a new instance
 /// </summary>
 protected internal virtual void AddData(IOid oid, string type, Data data) {
     WriteData(oid, data);
 }
 private static void WriteData(IOid xoid, Data data) {
     using (XmlWriter writer = XmlWriter.Create(XmlFile.GetFile(Filename(xoid)).FullName, XmlFile.Settings)) {
         WriteData(data, writer);
     }
 }
 /// <summary>
 ///     Save the data for latter retrieval
 /// </summary>
 public void Save(Data data) {
     WriteData(data.Oid, data);
 }