В дополнение к другим ответам я постараюсь добавить то, что знаю, в эту тему.
Короче говоря, они оба перезаписывают имя и пространство имен по умолчанию для [DataContract] и [DataMember] (Name) всем, что вы предоставляете этим свойствам.
Согласно документации MS для свойства DataContractAttribute.Namespace (они называются свойства атрибута, а не атрибута), в разделе «Совет» указывается ссылка , «Для данных в Для успешной передачи имя данных в контракте данных должно быть одинаковым как на клиенте, так и на сервере. В проектах Visual Basic по умолчанию добавляется префикс к пространству имен, определенному в каждом файле (называемом «корневым пространством имен»). назван в честь проекта). Добавление этого префикса приводит к тому, что пространства имен клиента и сервера будут различаться для одного и того же типа. Решение состоит в том, чтобы установить для свойства пространства имен значение «» или явно задать пространство имен контракта данных в это свойство. "
Из того, что я понял, чтобы атрибут DataContract мог сериализовать / десериализовать данные, данные должны иметь совпадающее пространство имен как на стороне клиента, так и на стороне сервера, что не всегда может иметь место в реальной ситуации. Например, ваши данные на стороне сервера, если они названы в читабельном и понятном виде, могут находиться в пространстве имен, имя которого выглядит примерно так: «NameOfTheSolution.Server.NameOfTheProject», тогда как на стороне клиента это может быть что-то вроде « NameOfTheSolution.Client.NameOfTheProject «. Из-за различного пространства имен, в котором находятся DataContracts, атрибут [DataContract] не сможет сериализовать / десериализовать данные между клиентом и сервером. Я не уверен, но это может быть причиной того, что он сказал, что метод не разрешен в вашем случае из-за несоответствующего пространства имен. В ситуации, когда пространства имен не совпадают, можно использовать свойство «Пространство имен» при использовании атрибута [DataContract] и предоставлять классу с обеих сторон (клиент / сервер) одно и то же пространство имен, хотя они физически лежат в разных пространствах имен.
[DataContract (Namespace = “Whatever you want, usually uri”)]
public class User
{}
Что касается свойства ‘Name’ атрибута [DataContract], оно переопределяет имя вашего datacontract на имя, которое вы указываете этому свойству. Одним из его применений в контексте атрибута DataMember является перегрузка метода в контракте данных. DataContract не допускает двух DataMember с одинаковыми именами, поэтому в таком случае полезно использовать свойство «Имя».