这是我的单身类人。
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) 并比较字段,使它们相同。