2015-02-20 2 views
1

Я читал статьи о преимуществах отправки сериализованных объектов через сеть. Производительность и стоимость.Сериализация объектов через сеть

Некоторые объяснили о DataContract и использовании JSON или XML-сериализации.

Но я не могу найти статьи о том, что произойдет, если я не использую эти атрибуты, и возвращаю объект, предполагая, что свойства и состояния моего объекта имеют примитивные типы. Очевидно, что когда я использую сериализатор, такой как DataContractJsonSerializer и его метод WriteObject конкретно, он будет генерировать исключение.

Что произойдет, если я вернусь, например, в методе веб-службы, объект Employee, который имеет атрибут «Serializable». Я имею в виду, что будет .net будет рассматривать этот результат.

[WebMethod] 
public Employee SendEmployeeData() 
{ 
} 

Объект будет передаваться через сеть в виде двоичного потока или что?

Требуется ли сериализовать объект для отправки через сеть?

Я также прочитал, что DataContractSerializer интерпретирует атрибут Serializable.

difference between DataContract attribute and Serializable attribute in .net

+2

Небольшое примечание: используйте Json.NET, а не DataContractSerializer. Производительность однозначно лучше, а атрибут аннотация чиста IMO. Даже Microsoft использует Json.NET в WebAPI 2. – pixelbadger

+0

Спасибо за подход. Это не первый раз, когда я это слышал, и я начинаю читать и об этом разбираться. –

ответ

2

Я имею в виду, что бы .net будет относиться к этому результату.

Это будет целиком и полностью использовать рамки/рамки, которые вы используете. WCF будет работать по-разному с ASMX, который будет работать по-разному с MVC, который будет ... бла-бла-бла.

Объект будет отправлен через сеть как двоичный поток или что?

Да; Потоки TCP представляют собой потоки

Требуется ли сериализовать объект для его отправки через сеть?

Да; вы можете отправлять только байты через данные; процесс преобразования объекта в серию байтов называется сериализацией.

Я также прочитал, что DataContractSerializer интерпретирует атрибут Serializable.

Ну ... вроде ... это не большое использование, хотя и является родственным с использованием BinaryFormatter (он может использовать NetDataContractSerializer, но имеет те же самые проблемы) - в основном: не делаю этого. Если вы используете API, который предназначен для обмена данными-контрактами, используйте контракт с данными. Здесь нет «лучшего» подхода; все сводится к тому, что вы пытаетесь сделать и каковы ваши приоритеты. JSON и XML имеют преимущества совместимости по сравнению с BinaryFormatter и др., Но есть и другие варианты с теми же преимуществами.

+1

Спасибо за ваш ответ. Согласно вашей фразе TCP-потоков. Требует ли .Net, чтобы у моих объектов был атрибут Serializable или нет? –

+2

@MaximusDecimus в значительной степени единственное, что заботится о '[Serializable]' - 'BinaryFormatter', которое вы не должны использовать в любом случае; главное, что использует 'BinaryFormatter' *, если вы не знаете *, - это * remoting *, который вы не должны использовать в любом случае. Поэтому, если вы не используете вещи, которые требуют '[Serializable]', вам не нужно добавлять '[Serializable]' –

+1

. Я добавлю комментарий @ MarcGravell, что, я думаю, было бы целесообразно сделать немного больше исследований потоков TCP (и других транспортных механизмов) и задать другой вопрос, конкретно связанный с этой темой. – pixelbadger

2

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

Они будут определенно не быть автоматически сериализованы с использованием BinaryFormatter. Атрибут Serializable - это всего лишь маркер до tell a BinaryFormatter для сериализации объекта.

Json.NET (на который я ссылался в своем комментарии) будет использовать отражение для построения сериализованной структуры данного объекта - даже dynamic. Следующий код будет построить динамический объект и преобразовать его в строку JSON, используя Json.NET:

//build request 
var dynamicObject = new { 
    message = "Hello World", 
    number = 32, 
    date = DateTime.Now 
}; 

//convert to JSON string 
string json = JsonConvert.SerializeObject(dynamicObject); 
Console.WriteLine(json); 
+0

Если вы не комментируете * вообще *, IIRC возвращается к поведению, как «BinaryFormatter» - который * не * рекомендуется рекомендовать –

+0

@MarcGravell - Да, спасибо за это. Как вы сказали в своем ответе, четко определенный контракт, безусловно, путь. – pixelbadger

Смежные вопросы