2017-01-22 4 views
-1

Это мой синглетный класс Person.Перерыв Синглтон с использованием сериализации 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 
    } 
} 

Теперь после сериализации у меня есть два разных объекта. Как класс singleton, как он может иметь два разных объекта?

ответ

4

Одноэлемент - это концепция программирования, а не языковая функция. Его вполне возможно создать код, который создает экземпляры классов, которые - теоретически - должны создаваться только на однострочной фабрике. Вам даже не нужно использовать сериализацию для достижения этого - просто используйте Activator.CreateInstance().

Может быть полезно также учитывать, что ваш конструктор классов также не должен вызываться; конечно, если ваш вызов new MyClass() будет выполнен, но десериализация не требует вызова конструктора. Сериализация как концепция хранит и регидратирует состояние экземпляра класса; поэтому ему не нужно подчиняться другим концепциям экземпляра класса, таким как область конструктора или логика конструктора.

0

После того, как вы сериализовали объект person в строку, он разбивает его на исходный объект Person p. Другими словами, новый объект строки не знает, что было раньше. Когда десериализуем строку sss в объект Person, он создает новый экземпляр этого объекта. Они могут иметь одно и то же значение, но они не являются одним и тем же экземпляром.

-1

Это не та же ссылка на объект. Реализация равенства по умолчанию - это сравнение экземпляров. Вы должны переопределить .Equals (obj) и сравнить поля для них, чтобы они были одинаковыми.

+0

Я думаю, что вы не поняли вопрос. Это то, что я спрашиваю, является ли класс singleton тем, как он может иметь 2 объекта? –

+0

Я вижу. Поскольку у вас есть частный ctor. Я уверен, что Jason.net может создавать объекты даже без ctor. Большая часть сериализации имеет эту возможность. Json.Net не использует ваше свойство PersonObj. –