好吧,我对它的运作方式或可能性有点模糊。我想序列化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,但我不反对在必要时切换到别的东西。
答案 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)
听起来您可能需要实现自己的序列化和反序列化功能。
以下是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; }
}
}