这是我的单一类人物。
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
}
}
现在序列化后我有两个不同的对象。由于类是单例,它如何才能有两个不同的对象?
答案 0 :(得分:4)
单身是一种编程概念 - 而不是语言特征。完全可以创建创建类的实例的代码 - 理论上 - 应该只由单例工厂创建。你甚至不需要使用序列化来实现它 - 只需使用Activator.CreateInstance()
。
考虑到你的类构造函数也不必被调用也可能有帮助;确定,如果您的呼叫new MyClass()
可以,但反序列化不必调用构造函数。序列化作为概念存储和重新水化类实例的状态;所以它不需要遵守其他类实例化概念,比如构造函数范围或构造函数逻辑。
答案 1 :(得分:0)
将person对象序列化为字符串后,它会将其引用回原始的Person p
对象。换句话说,新的字符串对象不知道它之前是什么。将字符串sss
反序列化为Person
对象时,它会创建该对象的新实例。它们可能具有相同的值,但它们不是同一个实例。
答案 2 :(得分:-1)
它们不是同一个对象引用。默认的相等实现是实例比较。您需要覆盖.Equals(obj)并将它们的字段进行比较。