Сериализуемый объект WCF и __BackingField - PullRequest
5 голосов
/ 04 сентября 2011

У нас есть сторонняя dll, которая содержит (помимо прочего) наши сущности.
Все объекты отмечены атрибутом [Serializeable].

Теперь нам нужно создать новые службы WCF, которые будут предоставлять некоторые из этих объектов.
Проблема в том, что объекты не объявляются с атрибутами DataContract и DataMember, к именам свойств добавляется __BackingField!

Я знаю, что использование атрибутов DataContarct \ Member решит эту проблему, но, учитывая, что я не могу модифицировать сторонние dll с сущностями, есть ли другой обходной путь?

Ответы [ 3 ]

5 голосов
/ 04 сентября 2011

Типы, украшенные атрибутом [Serializable], имеют сериализованные поля , а не свойства (это [Serializable] "контракт").Если сторонние типы используют автоматические свойства (как показано ниже), компилятор создаст поле с суффиксом k_BackingField, и это будет сериализовано.

Если вы не можете изменитьтипы в сторонней библиотеке, одна альтернатива будет использовать ту же библиотеку на клиенте.При создании прокси для службы (с помощью svcutil или Add Service Reference) вы можете ссылаться на стороннюю библиотеку, и сгенерированный клиент не будет создавать новые типы для контрактов, вместо этого повторно используя типы из библиотеки.Таким образом, вам не придется иметь дело с типами с публичными именами свойств _BackingField.

Автоматические свойства:

[Serializable]
public class MyType
{
    public string MyProp { get; set; }
}

Компилятор превратит его во что-то похожее на

[Serializable]
public class MyType
{
    private string <MyProp>k_BackingField;
    public string MyProp
    {
        [CompilerGenerated]
        get { return this.<MyProp>k_BackingField; }
        [CompilerGenerated]
        set { this.<MyProp>k_BackingField = value; }
    }
}
1 голос
/ 04 сентября 2011

Вы можете использовать XmlSerializerFormatAttribute , чтобы использовать XmlSerializer вместо DataContractSerializer в реализации службы.

Это будет работать медленнее, но это должно решить вашу проблему.

1 голос
/ 04 сентября 2011

Я предполагаю, что вы хотите выставить сторонние типы из службы.

Одним из решений, которое вы можете рассмотреть, является поддержка отдельной библиотеки, которая отражает типы в сторонней библиотеке.

Это имеет следующие преимущества:

  1. Владение - вам принадлежат типы, которые вы предоставляете, поэтому вы контролируете сериализацию / десериализацию через границы своей службы.
  2. Вы изолированы от внезапных изменений в типах другой стороны и можете изменять свои интерфейсы контролируемым образом.

С точки зрения SOA, если вы раскрываете типы другой стороны в своем сервисе, другая сторона должна предоставить типы в договорном формате, таком как XSD. Я думаю, что ваш дизайн требует каких-то довольно необоснованных прыжков с обручем с вашей стороны.

Это может быть больше работы, но это одноразовое упражнение.

Надеюсь, это поможет некоторым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...