Странное поведение 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.

Другие вопросы по тегам