Сериализуемый и Синхронизация - PullRequest
1 голос
/ 04 января 2012

У меня есть небольшой класс, который я сделал потокобезопасным с помощью атрибута [Synchronization], он также реализует интерфейс ContextBoundObject.Я хотел бы сделать этот класс [Serializable].Код компилируется, но я получаю исключение

System.Runtime.Remoting.RemotingException: Remoting cannot find field '__identity' on type 'System.MarshalByRefObject'

.Я знал, что классы, помеченные [Синхронизация], доступны через некоторый «удаленный» прокси, но я надеялся, что механизм сериализации по умолчанию будет работать.

Это небольшое приложение, класс представляет собой последовательность в памяти (целоеid) генератор, так что никакого реального удаленного взаимодействия не происходит.Я предполагаю, что могу синхронизироваться другими способами (ключевое слово lock), но я хотел бы знать, каково стандартное решение этой проблемы.

Обновление: в конце я отказался от [Синхронизация] для использования базовой сериализации.

Ответы [ 2 ]

1 голос
/ 04 января 2012

Вместо того, чтобы просто использовать атрибут Serializable, вы можете реализовать интерфейс ISerializable.

Подробнее об этом можно прочитать здесь: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx

В основном вам нужно реализовать один метод - GetObjectData- и конструктор с похожей подписью.

0 голосов
/ 04 января 2012

Отметьте любое свойство, которое не должно быть сериализовано, как [NonSerialized].

Также обратите внимание на «пользовательскую сериализацию».В дополнение к маркировке класса как [Serializable] вам необходимо реализовать ISerialiable и добавить собственный конструктор, таким образом:

[Serializable]
public class Foo : ISerializable
{
  // custom deserialization constructor]
  public Foo( SerializationInfo info , StreamingContext context )
  {
    //Get the values from info and assign them to the appropriate properties
  }

  public void GetObjectData( SerializationInfo info , StreamingContext context )
  {
    // populate info with appropriate key/value pairs.
    // Don't forget to explicitly serialize/deserialize and contained complex objects/structures
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...