Какова наиболее гибкая сериализация для объектов .NET, но простая в реализации?

Похоже, это может быть вызвано разными причинами. Хотя в моем случае это вызвано тем, что «ОС Windows не может обрабатывать слишком длинный путь», поэтому «aapt.exe» сообщил об этом сообщении об ошибке:

http: // start-coding .blogspot.com / 2015/07 / Android-разработка-в-окна-using.html

30
задан James Newton-King 3 March 2009 в 01:03
поделиться

12 ответов

Вы рассмотрели сериализацию к JSON вместо XML?

Json.NET имеет действительно мощный и гибкий сериализатор, который не имеет никаких проблем со словарями Хеш-таблиц / универсальными словарями и не требует никаких конкретных атрибутов. Я знаю, потому что я записал его:)

Это дает Вам "кучу" управления через различные варианты на сериализаторе, и это позволяет Вам переопределять, как тип сериализируется путем создания JsonConverter для него.

, По-моему, JSON более человекочитаем, чем XML и Json.NET дают опцию записать приятно отформатированный JSON.

Наконец проект является открытым исходным кодом, таким образом, можно ступить в код и сделать модификации, если Вы должны.

53
ответ дан James Newton-King 3 March 2009 в 01:03
поделиться
  • 1
    К вашему сведению, этот won' t работают с датами. Попробуйте: print text2int("nineteen ninety six") # 115 – Nick Ruiz 13 May 2014 в 14:26

Необходимо использовать NetDataContractSerializer. Это покрывает любой вид графа объектов и поддерживает дженерики, списки, полиморфизм (атрибут KnownType не нужен здесь), рекурсия и и т.д. Единственный недостаток состоит в том, что необходимо отметить все Вы классы с [сериализуемым] / [DataContract] атрибуты, но опыт показывает, что необходимо сделать своего рода руководство, подстраивающее так или иначе с тех пор не, все участники должны быть сохранены. Также это сериализирует в Xml, хотя его удобочитаемость сомнительна.

Мы имели те же требования как Ваш и выбрали это решение.

0
ответ дан adams 3 March 2009 в 01:03
поделиться
  • 1
    Право @yekta, я думаю recursive' s ответ хорошо в рамках ТАК ответ. Однако драгоценный камень предоставляет полному пакету тесты и другие функции. Во всяком случае я думаю, что у обоих есть их место. – dimid 29 October 2016 в 16:37

Для совместимости мы всегда использовали Сериализацию Xml и удостоверялись, что наш класс был разработан с нуля, чтобы сделать это правильно.

Мы создаем документ схемы XSD и генерируем ряд классов от того использования XSD.exe. Это генерирует частичные классы, таким образом, мы тогда создаем ряд соответствующих частичных классов для добавления дополнительных методов, мы хотим помочь нам заполнить классы и использовать их в нашем приложении (поскольку они фокусируются на сериализации и десериализации и являются небольшим difficut для использования иногда).

0
ответ дан Brody 3 March 2009 в 01:03
поделиться
  • 1
    Это на самом деле смотрит на меня это " пятнадцать sixteen" является неправильным? – PascalVKooten 29 October 2016 в 10:21

Возможно, более эффективный маршрут должен был бы сериализировать использование BinaryFormatter

, Как скопировано от http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename,
                  ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize =
         (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}
0
ответ дан Greg Ogle 3 March 2009 в 01:03
поделиться
  • 1
    Не очень сложный, ниже @recursive обеспечил логику (с немногими строками кода), который может использоваться. – yekta 10 October 2016 в 13:00

Я соглашаюсь, что находящиеся в DataContract методы сериализации (к JSON, XML, и т.д.) немного более сложны, чем я хотел бы.

, При попытке получить выезд JSON http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

, Это - часть расширений Ajax MS. По общему признанию это отмечается как Устаревшее в.NET 3.5, но упоминания ScottGu в его комментарии блога здесь ( http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx#4301973 ), что он не уверен, почему и это должно поддерживаться некоторое время дольше.

1
ответ дан Aaron Powell 3 March 2009 в 01:03
поделиться
  • 1
    Согласованный, но до it' s портированный, звонящий код Ruby лучше чем ничего. – dimid 10 October 2016 в 12:59

Поместите все классы, которые Вы хотите сериализировать в отдельный блок, и затем использовать sgen инструмент для генерации блока сериализации для сериализации к XML. Используйте атрибуты XML для управления сериализацией.

, Если необходимо настроить блок сериализации (и Вы будете потребность, что для поддержки классов, которые не являются IXmlSerializable и классами, которые содержат абстрактные узлы) затем дайте sgen команду выводить исходный код в отдельный файл и затем добавлять его к решению. Тогда можно изменить его по мере необходимости.

http://msdn.microsoft.com/en-us/library/bk3w6240 (По сравнению с 80) .aspx

FWIW, мне удалось сериализировать всю Платформу AdsML (более чем 400 классов) использующий эту технику. Действительно требовалась большая ручная настройка, но существует не обходящий это, если Вы рассматриваете размер платформы. (Я использовал отдельный инструмент для движения от XSD до C#)

1
ответ дан ilitirit 3 March 2009 в 01:03
поделиться
  • 1
    don' t называют код Ruby от кода Python или Python от рубина. They' ре достаточно близко, что что-то вроде этого должно просто быть портировано. – yekta 10 October 2016 в 11:51

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

0
ответ дан Ben Hoffstein 3 March 2009 в 01:03
поделиться
  • 1
    @recursive you' абсолютно правильное ре, но преимущество, которое имеет этот код, - то, что это обрабатывает " hundredth" (возможно, that' s, что Dawa пытался выделить). От звука описания другому подобному коду был нужен " один hundredth" и это isn' t всегда наиболее часто используемый термин (например, как в " она выбрала сотый объект к discard") – Neil 29 December 2016 в 23:05

Сериализация SOAP работала хорошо на меня, даже на объекты, не отмеченные с [сериализуемым]

1
ответ дан ripper234 3 March 2009 в 01:03
поделиться
  • 1
    Я думаю, что корректное английское написание 100 является " один hundred". – recursive 27 April 2011 в 20:14

IntermediateSerializer в Платформе XNA является довольно чертовски классным. Можно найти набор учебных руководств при использовании его в http://blogs.msdn.com/shawnhar

1
ответ дан TraumaPony 3 March 2009 в 01:03
поделиться
  • 1
    Это - то, что я люблю - наблюдение расширений ответов, которые подробно останавливаются на различных способах реализовать тот же ответ. Поскольку на вопрос уже ответили, это wouldn' t повреждают реализовывать его на языке опросчик didn' t определяют. Но это делает люди справки, которые приезжают, чтобы попытаться реализовать код. Для помощи будущим читателям этой проблемы, +1 –  30 August 2013 в 04:32

От Ваших требований это кажется, что XML-сериализация является лучшей.

, Какие проблемы Вы имеете с наборами при сериализации? Если Вы отсылаете к не знанию, какие атрибуты использовать в Списке или чем-то подобном, Вы могли бы попробовать атрибут XmlArray на своем свойстве. Можно определенно сериализировать набор.

2
ответ дан Ian Suttle 3 March 2009 в 01:03
поделиться
  • 1
    Я взял Ваш ответ и исправил некоторые ошибки. Добавленная поддержка " двадцать ten"-> 2010 и все десятки в целом. Можно найти его здесь: github.com/careless25/text2digits – stackErr 31 March 2019 в 02:51

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

1
ответ дан Jarrett Meyer 3 March 2009 в 01:03
поделиться

Если я вспоминаю, что это работает что-то вроде этого со свойством:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }

при сериализации этого Вы получили бы что-то как:

<Foo>
    <Bar />
    <Bar />
</Foo>

, Конечно, я должен, вероятно, подчиниться экспертам. Вот больше информации от MS: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

Сообщенный мне, если это удается для Вас.

3
ответ дан Ian Suttle 3 March 2009 в 01:03
поделиться
  • 1
    Robert, Программное обеспечение с открытым исходным кодом - все о людях, улучшающих его совместно. Я хотел библиотеку и видел, что люди хотели тот также. Так сделанный им. Это не может быть готово к производственным системам уровня или соответствовать модным словечкам учебника. Но, это работает на цель. Кроме того, было бы замечательно, если Вы могли бы отправить PR так, чтобы это могло быть улучшено далее для всех пользователей. – akshaynagpal 7 August 2016 в 06:27
Другие вопросы по тегам:

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