将对象序列化和反序列化为ID

时间:2013-12-11 16:01:54

标签: c# serialization

很抱歉,如果标题有点令人困惑,但我想不出更好的标题。

我的想法是我有一个可以通过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);
}    

}

1 个答案:

答案 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类,它变得更加简单,因为对象提取逻辑只在一个地方实现。