序列化时如何维护对象引用

时间:2012-02-08 01:18:27

标签: c# serialization

好吧,我对它的运作方式或可能性有点模糊。我想序列化Child类,但我实际上并不想在它执行Child.MyParent字段时序列化Parent对象...我只是希望序列化引用。这有可能,我该怎么做呢?

public class Parent
{ 
    public Child New()
    {
        return new Child(this);
    }
}

public class Child
{
    public Parent MyParent;

    public Child(Parent parent)
    {
        MyParent = parent;
    }
}

编辑:我正在使用DataContractSerializer,但我不反对在必要时切换到别的东西。

2 个答案:

答案 0 :(得分:3)

XMLIgnoreAttribute可以应用于您不想序列化的字段。例如,

public class Child
{
    [XmlIgnore]
    public Parent MyParent;

    public Child(Parent parent)
    {
        MyParent = parent;
    }
}

但是,就序列化对该字段的引用而言,您必须提供有关如何保留引用指向的对象的更多信息。您不仅仅序列化Parent成员(在您的情况下)是什么原因?序列化所有需要的公共成员是很常见的。

如果您只想使用序列化进行克隆,那么这样的事情应该有效:

private static Parent Clone(Parent parent)
{
    Parent parentClone = null;
    lock (m_lock) // serialize cloning.
    {
        IFormatter formatter = new BinaryFormatter();
        MemoryStream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, parent);
            stream.Seek(0, SeekOrigin.Begin);
            parentClone = (Parent)formatter.Deserialize(stream);
        }
    }

    return parentClone;
}

答案 1 :(得分:0)

听起来您可能需要实现自己的序列化和反序列化功能。

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.getobjectdata.aspx

以下是MSDN的摘录

[Serializable]
    public class Person : ISerializable
    {
        private string name_value;
        private int ID_value;

        public Person() { }
        protected Person(SerializationInfo info, StreamingContext context)
        {
            if (info == null)
                throw new System.ArgumentNullException("info");
            name_value = (string)info.GetValue("AltName", typeof(string));
            ID_value = (int)info.GetValue("AltID", typeof(int));
        }

        [SecurityPermission(SecurityAction.LinkDemand,Flags = SecurityPermissionFlag.SerializationFormatter)]
        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            if (info == null)
                throw new System.ArgumentNullException("info");
            info.AddValue("AltName", "XXX");
            info.AddValue("AltID", 9999);
        }

        public string Name
        {
            get { return name_value; }
            set { name_value = value; }
        }

        public int IdNumber
        {
            get { return ID_value; }
            set { ID_value = value; }
        }
    }