很抱歉,如果标题有点令人困惑,但我想不出更好的标题。
我的想法是我有一个可以通过ID获取对象的中央对象存储库,这些对象不应该被序列化。但是有几个对象的引用,应该序列化,但只作为ID,然后使用存储库从ID反序列化。
所以我想为我的对象实现ISerializable
接口,以便它将ID存储在GetObjectData
中,以便在反序列化时从ID恢复对象。问题是反序列化是在构造函数中完成的,所以我不能返回一个现有的对象......我怎么能绕过这个呢?或者可能有关于如何做到这一点的其他建议?
编辑 - 似乎不清楚,所以我会试着澄清。
public class Ref {
MyObj obj;
}
public class MyObj {
string id;
string objData;
public static MyObj GetObj(string id) {
// reads MyObj from a file or web service based on ID
// caches objects as well
}
}
现在,在我的程序中,我有几个Ref
的实例,它引用了不同的MyObj
。我想序列化这些Ref
对象,而不是实际序列化MyObj
,而是我只想序列化ID,以后我可以在反序列化时使用它来获取对象。
我希望做这样的事情:
[Serializable]
public class MyObj : ISerializable {
// code from before ...
public MyObj (SerializationInfo info, StreamingContext ctxt) {
return MyObj.GetObj(info.GetString("id")); // this is not possible since this is a constructor and not a factory!
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt) {
info.AddValue("id", this.id);
}
}
答案 0 :(得分:1)
这是一个想法。例如,创建一个名为ObjectHolder的包装类。您的其他类可以引用此ObjectHolder,此ObjectHolder引用存储库中的实际对象。重写ObjectHolder类的序列化和反序列化逻辑。您将拥有许多ObjectHolder引用,而不是相同对象的许多副本。
这是另一个。如果您没有太多课程,它会起作用。将对象引用ID存储在私有字段中。编写一个从存储库中获取对象的getter属性。这样,只有ID才会被序列化,并且总是会动态获取对象。像这样:
private string id; // serialized
public Whatever MyObject { // not serializer
get { return Repository.Get(id); }
}
你知道,如果你这样做,你必须在很多地方改变你的引用。使用ObjectHolder类,它变得更加简单,因为对象提取逻辑只在一个地方实现。