是否有在反序列化对象时调用的方法

本文关键字:调用 方法 对象 反序列化 是否 | 更新日期: 2023-09-27 18:34:40

我正在尝试序列化一个对象,但HttpClient导致了问题。我不能序列化 HttpClient - 我个人也不想序列化 - 但是当对象被反序列化时,我需要确保 HttpClient 可用于发出请求。

是否有在反序列化对象时调用的方法,以便我可以确保创建 HttpClient 对象并且它可供使用?

下面是一个示例。这个想法是用户保存会话,序列化的文件保存到磁盘。当用户加载文件时,cookieJar 将恢复用户的 Twitter 会话,这意味着他们不必重新登录(如果 cookie 会话仍然有效(。我可以只存储 CookieCollection,但是,对象中还有其他数据也需要存储。因此,我为什么要这样做。

[serializable()]
public class Twitter
{
    private HttpClient client;
    private CookieContainer cookieJar;
    private String username, password;
    public Twitter(string _username, string _password)
    {
        username = _username;
        password = _password;
    }
}

是否有在反序列化对象时调用的方法

回答最初的问题:IDeserializationCallback为此目的而存在的。

[Serializable]
public class Twitter : IDeserializationCallback
{
    #region IDeserializationCallback
    void IDeserializationCallback.OnDeserialization(Object sender)
    {
    }
    #endregion
}

或者,您可以使用[OnDeserialized]

[Serializable]
public class Twitter
{
    [OnDeserialized]
    void OnDeserialized(Object sender)
    {
    }
}

顺便说一句,我会考虑将[NonSerialized]应用于HttpClient和CookieContainer,并在默认ctor中启动它们。

我会创建一个 DTO 来序列化和加载磁盘中的数据。

public class TwitterData
{
    public string UserName { get; set; }
    public string EncryptedPassword { get; set; }
    public string SessionKey { get; set; }
    public CookieContainer CookieContainer { get; set; }
}

然后,您可以从 DTO 重建Twitter类。