Как сериализировать классы, которые не были разработаны, чтобы быть сериализированными?

Нам нужно зарегистрировать наш сигнал из функции AppConfig.ready(). ссылка и здесь нам нужно подключить наш сигнал. Надеюсь, что это решит вашу проблему. Еще одна дополнительная вещь, если ваше приложение не является частью INSTALLED_APPS, не забудьте добавить init .py

Я хотел бы добавить дополнительную ссылку [ 114], пожалуйста, пройдите раздел Where Should the Code Live?, чтобы устранить ваши сомнения.

12
задан John Saunders 31 July 2009 в 03:26
поделиться

7 ответов

Используйте JavaScriptSerializer. Он находится в пространстве имен System.Web.Script.Serialization и реализован в платформе 3.5 в сборке System.Web.Extensions.dll.

С помощью этого класса вы можете сериализовать любой POCO независимо от того, помечен ли он как [Serializable] или нет. , Для использования сериализации JSON ваша программа не обязательно должна быть веб-приложением. Вот пример:

public class Unserializable
{
  public int Age { get; set; }
  public int ID { get; set; }
  public string Name { get; set; }
}

public class Program
{
  static void Main()
  {
    var u = new Unserializable
            {
              Age = 40,
              ID = 2,
              Name = "Betty"
            };
    var jser = new JavaScriptSerializer();
    var jsonText = jser.Serialize( u );
    // next line outputs {"Age":40,"ID":2,"Name":"Betty"}
    Console.WriteLine( jsonText );
  }
}
9
ответ дан 2 December 2019 в 20:19
поделиться

Я бы использовал инструмент генерации кода (mygeneration, T4 и т. Д.) Для генерации DTO для сериализации. ..

0
ответ дан 2 December 2019 в 20:19
поделиться

Похоже, работа для ... суррогатов сериализации!

Перейдите на http://msdn.microsoft.com/en-us/magazine/cc188950.aspx

для обзора.

7
ответ дан 2 December 2019 в 20:19
поделиться

Вам не нужно использовать для команды ; find установит для ERRORLEVEL одно из этих значений в зависимости от результата:

  • 0, было найдено хотя бы одно совпадение.
  • 1, совпадений не найдено.
  • 2 или более,

    Если вы получите / установите все члены, у вас будет объект в идентичном состоянии. (Вам может потребоваться рекурсивно просмотреть все ваши объекты, если у вас есть сложные члены.)

    Что касается того, как вы храните данные на диске, оба работают в xml или двоичном формате. Если вы хотите увидеть его и сделать его читабельным, тогда используйте XML. (Я бы порекомендовал это для вашего первого удара, поскольку это значительно упростит отладку.)

0
ответ дан 2 December 2019 в 20:19
поделиться

Другой вариант - использовать шаблон адаптера.

Хорошая новость в том, что вам не придется менять исходный класс. Плохая новость состоит в том, что вы, вероятно, в конечном итоге напишете вдвое больше кода, чем существует в первом «неизменяемом» классе.

В итоге вы получите 2 новых класса: адаптер и новый класс serializble.

] Идея состоит в том, что адаптер знает, как создать класс serizliable, исследуя несериализуемый класс. Чтобы пойти другим путем (из сериализуемого в несериализуемый), вы можете снова использовать адаптер (конечно, здесь я предполагаю, что ваши частные сеттеры на самом деле устанавливаются через параметризованный конструктор).

Вот подробный шаблон.

0
ответ дан 2 December 2019 в 20:19
поделиться

Непростой обходной путь.

Вероятно, вы хотите только сериализовать / десериализовать поля (частные и общедоступные) в классах и делать это рекурсивно. Вам, вероятно, потребуется использовать отражение, чтобы добраться до них. Не де / сериализуйте свойства, потому что при установке значения свойства могут возникнуть побочные эффекты. Вам также придется рекурсивно де / сериализовать все поля, которые являются объектами. Проблема состоит в том, чтобы знать, где остановиться.

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

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

Короче говоря, вам может быть лучше создать специальный набор классов-оболочек, который делает наилучшее предположение форма воссоздания ваших проприетарных классов из сериализованного формата. Затем ваши специализированные классы можно сделать сериализуемыми. Это не будет простой задачей.

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

Затем ваши специализированные классы можно сделать сериализуемыми. Это не будет простой задачей.

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

Затем ваши специализированные классы можно сделать сериализуемыми. Это не будет простой задачей.

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

0
ответ дан 2 December 2019 в 20:19
поделиться

Это действительно зависит от масштаба вашей проблемы и требуемой производительности.

Если у вас есть 1 проблемный класс, я бы просто написал суррогатный класс, который может сериализовать / десериализовать этот класс. Если вы говорите о сотнях классов, вам, вероятно, понадобится среда сериализации, которая поддерживает все тонкости. Никакая конструкция без параметров не является кошмаром, независимо от того, какую структуру сериализации вы пишете или используете, вам нужно заранее знать параметры, которые нужно передать конструктору. Частные сеттеры / словари / списки и т. Д. Не представляют особой проблемы.

Я написал фреймворк мини-сериализации для Media Browser, который является BSD. Я сосредоточился на производительности, но методы, которые я использую, могут быть адаптированы к вашей проблеме. Можно использовать аналогичные методы, используемые в буферах протокола Марка .

Если производительность вообще не важна, можно довольно быстро закодировать довольно простую структуру сериализации, использующую отражение, все становится сложно, когда вы пытаетесь сохранить производительность.

0
ответ дан 2 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

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