将对象序列化为 XML

6

对于二进制序列化,我使用

public ClassConstructor(SerializationInfo info, StreamingContext ctxt) {

    this.cars = (OtherClass)info.GetValue("Object", typeof(OtherClass));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt) {
    info.AddString(this.name);
    info.AddValue("Object", this.object);
}

我想对XML序列化做同样的事情(类实现IXmlSerializable接口,因为私有属性设置器),但我不知道如何将对象放入序列化程序(XmlWriter对象)。

public void WriteXml( XmlWriter writer ) {
    writer.WriteAttributeString( "Name", Name );
    writer. ... Write object, but how ???
}
public void ReadXml( XmlReader reader ) {
    this.Name = reader.GetAttribute( "Name" );
    this.object = reader. ... how to read ??
}

可能我可以使用类似这样的东西


XmlSerializer xsSubmit = new XmlSerializer(typeof(MyObject));
var subReq = new MyObject();
StringWriter sww = new StringWriter();
XmlWriter writer = XmlWriter.Create(sww);
xsSubmit.Serialize(writer, subReq);
var xml = sww.ToString(); // Your xml

也许有一种更简单的方法,只需使用WriteXml方法提供的XmlWriter对象即可。

在反序列化时,使用字节(Byte)来表示对象,并将其强制转换回去。 - Estefany Velez
我相信(基于我的当前阅读),XmlSerializer将自动利用您的GetObjectData /构造函数设置。 - Roger Willcocks
2个回答

6

下载FairlyCertain A/B测试库

在这个优秀的代码中,你会找到一个XML序列化器类,在SerializationHelper.cs中。

摘录:

    /// <summary>
    /// Given a serializable object, returns an XML string representing that object.
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static string Serialize(object obj)
    {
        XmlSerializer xs = new XmlSerializer(obj.GetType());
        using (MemoryStream buffer = new MemoryStream())
        {
          xs.Serialize(buffer, obj);
          return ASCIIEncoding.ASCII.GetString(buffer.ToArray());
        }
    }

你的代码(来自'FairlyCertain')看起来与我已经发布的类似。我希望有更简单(内置)的方法,不需要使用新的XmlSerializer对象。我想可能是我眼瞎找不到:(无论如何,谢谢。 - Soul Reaver

4
我决定按照我写问题的方式来处理 - 使用XmlWriter对象,无论是否采用Ofer Zelig的方法都必须使用该对象。
namespace System.Xml.Serialization {
    public static class XmlSerializationExtensions {
        public static readonly XmlSerializerNamespaces EmptyXmlSerializerNamespace = new XmlSerializerNamespaces(
            new XmlQualifiedName[] {
                new XmlQualifiedName("") } );

        public static void WriteElementObject( this XmlWriter writer, string localName, object o ) {
            writer.WriteStartElement( localName );
            XmlSerializer xs = new XmlSerializer( o.GetType() );
            xs.Serialize( writer, o, EmptyXmlSerializerNamespace );
            writer.WriteEndElement();
        }

        public static T ReadElementObject< T >( this XmlReader reader ) {
            XmlSerializer xs = new XmlSerializer( typeof( T ) );
            reader.ReadStartElement();
            T retval = (T)xs.Deserialize( reader );
            reader.ReadEndElement();
            return retval;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接