public XElement CreateXmlElement(NomadObject obj, XElement parent = null) { Context.State = ContextStateType.Object; Context.ObjectIndex++; var name = XName.Get(obj.Id); var elem = new XElement(name); if (parent != null) { parent.Add(elem); } foreach (var attr in obj.Attributes) { if (attr.Id == "RML_DATA") { using (var bs = new BinaryStream(attr.Data.Buffer)) { var rmlSize = bs.ReadInt32(); var rmlBuffer = bs.ReadBytes(rmlSize); using (var rs = new BinaryStream(rmlBuffer)) { var rmlData = new NomadRmlSerializer(); var rml = rmlData.Deserialize(rs); var rmlRoot = new XElement("RML_DATA"); var rmlElem = CreateXmlElement(rml, rmlRoot); elem.Add(rmlRoot); } } } else { CreateXmlAttribute(attr, elem); } } foreach (var child in obj.Children) { CreateXmlElement(child, elem); } return(elem); }
protected void WriteRmlData(BinaryStream stream, NomadObject data) { byte[] rmlBuffer = null; using (var bs = new BinaryStream(1024)) { var rmlData = new NomadRmlSerializer(); rmlData.Serialize(bs, data); rmlBuffer = bs.ToArray(); } var size = DescriptorTag.Create(rmlBuffer.Length); var next = DescriptorTag.Create(size); next.WriteTo(stream); size.WriteTo(stream); stream.Write(rmlBuffer, 0, rmlBuffer.Length); }
public NomadObject ReadXmlObject(XElement xml, NomadObject parent = null) { Context.State = ContextStateType.Object; Context.ObjectIndex++; var name = xml.Name.LocalName; var id = StringId.Parse(name); var isRml = false; if (parent != null) { isRml = parent.IsRml; } if (!isRml && (id == "RML_DATA")) { isRml = true; } if (isRml) { XElement rmlElem = null; foreach (var elem in xml.Elements()) { if (rmlElem != null) { throw new XmlException("Too many elements in RML_DATA node!"); } rmlElem = elem; } if (rmlElem == null) { throw new XmlException("Empty RML_DATA nodes are cancerous to your health!"); } var rmlRoot = new NomadObject(true) { Id = "RML_DATA" }; ReadRmlObject(rmlElem, rmlRoot); byte[] rmlBuffer = null; using (var bs = new BinaryStream(1024)) { // don't write size yet bs.Position += 4; var rmlData = new NomadRmlSerializer(); rmlData.Serialize(bs, rmlRoot); // write size var rmlSize = (int)(bs.Position - 4); bs.Position = 0; bs.Write(rmlSize); rmlBuffer = bs.ToArray(); } if (parent != null) { var rml = new NomadValue() { Id = id, Data = new AttributeData(DataType.RML, rmlBuffer), }; parent.Attributes.Add(rml); } return(rmlRoot); } var result = new NomadObject(isRml) { Id = id }; foreach (var attr in xml.Attributes()) { ReadXmlAttribute(attr, result); } foreach (var node in xml.Elements()) { ReadXmlObject(node, result); } if (parent != null) { parent.Children.Add(result); } return(result); }
protected NomadObject ReadObject_FmtA(BinaryStream stream, NomadObject parent = null) { Context.State = ContextStateType.Object; Context.ObjectIndex++; var ptr = (int)stream.Position; var nChildren = DescriptorTag.Read(stream, ReferenceType.Index); if (nChildren.Type == DescriptorType.Reference) { throw new InvalidOperationException("Cannot deserialize an object reference directly!"); } var hash = stream.ReadInt32(); var id = StringId.Parse(hash); var result = new NomadObject(id); Context.AddRef(result, ptr); if (result.IsRml) { var next = DescriptorTag.Read(stream, ReferenceType.Index); var rmlBase = (int)stream.Position; var rmlSize = stream.ReadInt32(); var rmlBuffer = stream.ReadBytes(rmlSize); using (var bs = new BinaryStream(rmlBuffer)) { var rmlData = new NomadRmlSerializer(); var rml = rmlData.Deserialize(bs); result.Children.Add(rml); } stream.Position = (rmlBase + next); } else { var nAttrs = DescriptorTag.Read(stream, ReferenceType.Index); for (int i = 0; i < nAttrs; i++) { ReadAttribute_FmtA(stream, result); } for (int i = 0; i < nChildren; i++) { var cP = (int)stream.Position; var cD = DescriptorTag.Read(stream, ReferenceType.Index); // rip if (cD.IsIndex) { var idx = cD.Value; var childRef = Context.GetRefByIdx(idx) as NomadObject; result.Children.Add(childRef); } else { // move back stream.Position = cP; ReadObject_FmtA(stream, result); } } } if (parent != null) { parent.Children.Add(result); } return(result); }