使用序列化C#断开Singleton

时间:2017-01-22 19:31:00

标签: c# serialization json.net singleton

这是我的单一类人物。

public class Person
{
    private static Person _person = null;

    private Person()
    { }

    public string Name { get; }

    public static Person PersonObj
    {
        get
        {
            if (_person == null)
                _person = new Person();

            return _person;
        }
    }
}

现在我可以通过序列化创建这个类的两个实例。

static void Main(string[] args)
{
    Person p = Person.PersonObj;
    string sss = Newtonsoft.Json.JsonConvert.SerializeObject(p);
    Person p1 = JsonConvert.DeserializeObject<Person>(sss);    
    if (p != p1)
    {
           // insert here 
    }
} 

现在序列化后我有两个不同的对象。由于类是单例,它如何才能有两个不同的对象?

3 个答案:

答案 0 :(得分:4)

单身是一种编程概念 - 而不是语言特征。完全可以创建创建类的实例的代码 - 理论上 - 应该只由单例工厂创建。你甚至不需要使用序列化来实现它 - 只需使用Activator.CreateInstance()

考虑到你的类构造函数也不必被调用也可能有帮助;确定,如果您的呼叫new MyClass()可以,但反序列化不必调用构造函数。序列化作为概念存储和重新水化类实例的状态;所以它不需要遵守其他类实例化概念,比如构造函数范围或构造函数逻辑。

答案 1 :(得分:0)

将person对象序列化为字符串后,它会将其引用回原始的Person p对象。换句话说,新的字符串对象不知道它之前是什么。将字符串sss反序列化为Person对象时,它会创建该对象的新实例。它们可能具有相同的值,但它们不是同一个实例。

答案 2 :(得分:-1)

它们不是同一个对象引用。默认的相等实现是实例比较。您需要覆盖.Equals(obj)并将它们的字段进行比较。