Проблема с десериализацией статического свойства в .Net - PullRequest
0 голосов
/ 17 сентября 2009

У меня есть класс с именем Test, который имеет четыре открытых свойства, и одно из них является статическим. проблема в том, что после десериализации статическое свойство содержит нулевое значение. Я отладил код и обнаружил, что на стороне сервера он содержит значение, являющееся коллекцией, но на стороне клиента он становится нулевым после десериализации. я знаю, что статические члены не сериализуются и не десериализуются, поэтому очевидно, что они должны содержать значение.

Ответы [ 4 ]

2 голосов
/ 17 сентября 2009

Если статическое значение инициализируется при загрузке типа (через инициализатор поля или через инициализатор типа / статический конструктор), тогда оно должно содержать значение.

Если, однако, статическое значение на стороне сервера инициализируется как побочный эффект вызова некоторого метода, то вам придется воспроизвести этот вызов метода также на клиенте.

2 голосов
/ 17 сентября 2009

Статические переменные являются глобальными и сохраняют состояние - поэтому они существуют исключительно в контексте приложения или, другими словами, в памяти.

Вы можете передать значение статического свойства в другое нестатическое свойство, но не можете отправить память вашего приложения клиенту.

1 голос
/ 17 сентября 2009

Я не уверен, что понимаю ... как вы говорите в своем вопросе:

я знаю, что статические члены не сериализуются и не десериализуются ...

Учитывая это, почему вы ожидаете, что значение от сервера распространится на клиента? Вам нужно будет найти альтернативные способы передачи этого свойства (создать свойство экземпляра, отправить собственное сообщение и т. Д.)

0 голосов
/ 05 апреля 2010

Помните, что статические значения элементов существуют в конкретном .NET домене приложения , а домены приложений существуют в конкретном процессе операционной системы.

Учитывая, что сервер и клиент - это разные процессы операционной системы и, возможно, даже разные машины, как упоминал Адам, невозможно, чтобы значение, которое вы имели на сервере, автоматически передавалось клиенту без вас написание некоторого кода.

Я думаю, что, возможно, существует неправильное представление - сериализация не упаковывает экземпляр и его статические элементы на сервере, а отправляет его клиенту. Он извлекает значения элементов, которые он считает сериализуемыми (например, элементы, помеченные [DataMember] или элементами экземпляра, но не статические элементы), и отправляет клиенту только эти значения.

Следовательно, значение на клиенте будет таким же, как значение на сервере, которое было до того, как вы установили его на значение, которое вы теперь ожидаете увидеть на клиенте.

Однако: Я заметил, что вы также упоминаете, что видите, что ваша коллекция имеет значение null.

Если вы используете DataContractSerializer в среде PartialTrust, учтите, что он может не вызывать конструктор вашего класса.

Цитата:

При создании экземпляра целевого объекта во время десериализации DataContractSerializer не вызывает конструктор целевого объекта.

Если эта коллекция была создана вашим конструктором, это может объяснить, почему вы видите null.

...