使用序列化 C# 中断单一实例



这是我的单身类人。

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 
    }
} 

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

单例是一个编程概念 - 而不是语言功能。完全可以创建创建类实例的代码,这些类的实例理论上只能由单例工厂创建。您甚至不需要使用序列化来实现这一点 - 只需使用 Activator.CreateInstance() .

考虑到你的类构造函数也不必被调用,这可能也会有所帮助;当然,如果你的调用new MyClass()它会做,但反序列化不必调用构造函数。序列化作为概念存储和解除冻结类实例的状态;因此,它不需要遵守其他类实例化概念,例如构造函数范围或构造函数逻辑。

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

使用 Reflection 覆盖私有构造函数或使用 MemberWiseClone() 实现 ICloneable,您可以创建两个对象。但不建议这样做。

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

相关内容

  • 没有找到相关文章

最新更新