Странное поведение WCF с сериализацией объектов
Недавно я столкнулся со странным поведением в сериализации WCF.
Это простой сервис, который предоставляет один контракт операции и возвращает объект класса (Этот класс не имеет атрибутов [Serializable] или [DataContract]).
Однако, когда я вызываю эту операцию со стороны клиента, она работает отлично, и потребитель получает объект этого класса (с фактическими данными в нем).
Поскольку я считаю, что его нельзя передавать по проводам, поскольку его нельзя сериализовать, пожалуйста, дайте мне знать, если я что-то упустил.
Пример кода
public class MyService:IService
{
public Person GetPerson()
{
Person person = new Person();
person.Name = "Brian";
return person;
}
}
public class Person
{
public string Name { get; set; }
}
<services>
<service name="MyService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/MyService"/>
</baseAddresses>
</host>
<endpoint address="TestService1"
binding="basicHttpBinding"
contract="BindingTestServer.IService" ></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
1 ответ
Поскольку многие программисты были перегружены атрибутами [DataContract] и [DataMember], Microsoft заставила сериализатор контрактов данных обрабатывать все классы - даже без этих атрибутов - так же, как старый сериализатор XML.
Таким образом, вам больше не нужно добавлять контракты данных или атрибуты элементов данных - если вы этого не сделаете, сериализатор контрактов данных будет сериализовать все открытые свойства вашего класса, как это сделал бы сериализатор XML.