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

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

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

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

[WebMethod]
public Employee SendEmployeeData()
{
}

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

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

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

разница между атрибутом DataContract и атрибутом Serializable в .NET

1
Maximus Decimus 20 Фев 2015 в 17:31
2
Небольшое примечание: используйте Json.NET, а не DataContractSerializer. Производительность бесспорно лучше, а аннотация атрибута чище IMO. Даже Microsoft использует Json.NET в WebAPI 2.
 – 
pixelbadger
20 Фев 2015 в 17:49
Спасибо за подход. Я не первый раз слышу об этом, и я начинаю читать и исследовать об этом.
 – 
Maximus Decimus
20 Фев 2015 в 17:58

2 ответа

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

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

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

Да; TCP-потоки — это потоки

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

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

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

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

2
Marc Gravell 20 Фев 2015 в 17:55
1
Спасибо за Ваш ответ. Согласно вашей фразе потоков TCP. Требует ли .Net, чтобы мои объекты имели атрибут Serializable или нет?
 – 
Maximus Decimus
20 Фев 2015 в 18:02
2
Практически единственная вещь, которая заботится о [Serializable], это BinaryFormatter, которую вы все равно не должны использовать; главное, что использует BinaryFormatter без вашего ведома, — это удаленное взаимодействие, которое вам не следует использовать в любом случае. Поэтому, если вы не используете вещи, требующие [Serializable], нет, вам не нужно добавлять [Serializable].
 – 
Marc Gravell
20 Фев 2015 в 18:05
1
Я добавлю к комментарию @MarcGravell, что, по моему мнению, было бы целесообразно немного больше изучить потоки TCP (и другие транспортные механизмы) и задать другой вопрос, конкретно связанный с этой темой.
 – 
pixelbadger
20 Фев 2015 в 18:06

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

Они определенно не будут сериализованы автоматически с помощью BinaryFormatter. Атрибут Serializable — это просто маркер, указывающий 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);
2
pixelbadger 20 Фев 2015 в 18:04
Если вы не аннотируете вообще, IIRC возвращается к поведению, очень похожему на BinaryFormatter, что не рекомендуется
 – 
Marc Gravell
20 Фев 2015 в 17:58
- Да, спасибо, что разъяснили это. Как вы сказали в своем ответе, четко определенный контракт, безусловно, правильный путь.
 – 
pixelbadger
20 Фев 2015 в 17:59