Какой смысл интерфейса ISerializable?

Я предполагаю, что вы имеете в виду, что вы хотите запускать «Интерактивное окно Python», а не просто консоль iPython при запуске

В настоящее время нет способа запустить его при запуске. По крайней мере, без написания другого расширения, которое запускало бы команду при открытии рабочей области. Было бы просто добавить его. Вероятно, настройка рабочего пространства. Вы можете зарегистрировать проблему здесь: https://github.com/Microsoft/vscode-python/issues/new

Для вас второй вопрос: «Выполнить» в spyder, у нас есть « Запустить текущий файл в интерактивном окне Python ». Это работает на любом файле Python. Вы можете добраться до него через контекстное меню файла или через палитру команд.

51
задан MatthewMartin 14 October 2014 в 15:08
поделиться

4 ответа

ISerializable is used to provide custom binary serialization, usually for BinaryFormatter (and perhaps for remoting purposes). Without it, it uses the fields, which can be:

  • inefficient; if there are fields that are only used for efficiency at runtime, but can be removed for serialization (for example, a dictionary may look different when serialized)
  • inefficient; as even for fields that are needed it needs to include a lot of additional metadata
  • invalid; if there are fields that cannot be serialized (such as event delegates, although they can be marked [NonSerialized])
  • brittle; your serialization is now bound to the field names - but fields are meant to be an implementation detail; see also Obfuscation, serialization and automatically implemented properties

By implementing ISerializable you can provide your own binary serialization mechanism. Note that the xml equivalent of this is IXmlSerializable, as used by XmlSerializer etc.

For DTO purposes, BinaryFormatter should be avoided - things like xml (via XmlSerializer or DataContractSerializer) or json are good, as are cross-platform formats like protocol buffers.

For completeness, protobuf-net does include hooks for ISerializable (allowing you to use a portable binary format without writing lots of code), but BinaryFormatter wouldn't be your first choice here anyway.

66
ответ дан 7 November 2019 в 10:13
поделиться

With the ISerializable you can write custom methods in your object to take over serialization when doing binary serialization, to serialize your objects in a different manner than what the default approach used by BinaryFormatter will do.

In other words, if the default approach serializes your object in a different manner than how you want it to serialize as, you can implement ISerializable for complete control. Note that hand in hand with ISerializable, there's also a custom constructor you should implement.

XmlSerialization will of course only use properties, ISerializable has nothing to do with XML serialization.

Thanks Marc and Pop for the comments, I was a bit hasty with my first answer.

5
ответ дан 7 November 2019 в 10:13
поделиться

Классы могут быть сериализованы в .NET одним из двух способов:

  1. Маркировка класса с помощью SerializableAttribute и декорирование всех полей, которые вы не делаете хотят быть сериализованными с атрибутом NonSerialized . (Как отмечает Марк Гравелл, BinaryFormatter , который обычно используется для форматирования объектов ISerializable , автоматически сериализует все поля, если они специально не отмечены иначе.)
  2. Реализация Интерфейс ISerializable для полностью настраиваемой сериализации.

Первый проще в использовании, поскольку он просто включает в себя маркировку объявлений с атрибутами, но его возможности ограничены. Последнее обеспечивает большую гибкость, но требует значительно больше усилий для реализации. must be marked with the SerializableAttribute. If a class needs to control its serialization process, it can implement the ISerializable interface. The Formatter calls the GetObjectData at serialization time and populates the supplied SerializationInfo with all the data required to represent the object. The Formatter creates a SerializationInfo with the type of the object in the graph. Objects that need to send proxies for themselves can use the FullTypeName and AssemblyName methods on SerializationInfo to change the transmitted information.

In the case of class inheritance, it is possible to serialize a class that derives from a base class that implements ISerializable. In this case, the derived class should call the base class implementation of GetObjectData inside its implementation of GetObjectData. Otherwise, the data from the base класс не будет сериализован.

9
ответ дан 7 November 2019 в 10:13
поделиться

Чтобы сделать объект "транспортабельным", вы должны его сериализовать. Например, если вы хотите перенести данные объекта с помощью .NET Remoting или веб-служб, вы должны предоставить методы, которые сериализуют данные вашего объекта, уменьшая количество экземпляров объекта до переносимого формата, который представляет представление объекта с высокой точностью.

Затем вы также можете взять сериализованное представление, перенести его в другой контекст, например на другой компьютер, и перестроить ваш исходный объект.

При реализации интерфейса ISerializable класс должен предоставлять метод GetObjectData, который является включенный в интерфейс, а также специализированный конструктор, который специализируется на приеме двух параметров: экземпляр SerializationInfo, и экземпляр StreamingContext.

Если ваши классы не требуют детального контроля их состояния объекта, то вы можете просто использовать атрибут [Serializable] . Классы, которые требуют большего контроля над процессом сериализации, могут реализовать интерфейс ISerializable.

3
ответ дан 7 November 2019 в 10:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: