2010-12-29 3 views
1

Одна из моих функций WCF возвращает объект, который имеет переменную-член типа из другой библиотеки, которая находится вне моего контроля. Я не могу украсить классы библиотеки. На самом деле, я даже не могу использовать DataContractSurrogate, потому что классы библиотеки имеют частные переменные-члены, необходимые для работы (т. Е. Если я возвращаю объект без этих частных переменных-членов, исключения для публичных свойств исключают).WCF - Возвращаемый объект без сериализации?

Если я говорю, что интероперабельность для этого конкретного метода не требуется (по крайней мере, пока владельцы этой библиотеки не смогут пересмотреть, чтобы сделать их объекты сериализуемыми), возможно ли использовать WCF для возврата этого объекта, чтобы он мог по крайней мере, потребляется клиентом .NET?

Как мне это сделать?

Обновление: Я добавляю псевдокод ниже ...

// My code, I have control 

[DataContract] 
public class MyObject 
{ 
    private TheirObject theirObject; 

    [DataMember] 
    public int SomeNumber 
    { 
    get { return theirObject.SomeNumber; } // public property exposed 
    private set { } 
    } 
} 

// Their code, I have no control 

public class TheirObject 
{ 
    private TheirOtherObject theirOtherObject; 

    public int SomeNumber 
    { 
    get { return theirOtherObject.SomeOtherProperty; } 
    set { // ... } 
    } 
} 

Я попытался добавить DataMember к моему экземпляру их объекта, делая его общедоступным, используя DataContractSurrogate, и даже вручную потокового объекта. Во всех случаях я получаю некоторую ошибку, которая в конечном итоге приводит к тому, что их объект не является явным сериализуемым.

+0

Вы изучали двоичную сериализацию? –

+0

@Sergei: Я попытался вручную сериализоваться в двоичном формате с использованием BinaryFormatter, но получил исключение, не связанное с сериализацией. Считаете ли вы, что двоичная сериализация WCF может работать лучше с учетом этой ошибки? – Mayo

ответ

2

Конечно, написать класс-оболочку, которая имеет все те же открытые свойства доступны и просто поставить "get { return internalObject.ThisProperty; }. Украсить класс-обертку, так что он работает с WCF.

+0

Но свойства ребенка, которые он использует, по-прежнему скрыты и до сих пор не являются сериализуемыми, и я не думаю, что есть способ обойти это ... – veljkoz

+0

@veljkoz: но поскольку он не может сериализовать реальный объект, t отправить реальный объект. Он должен отправить достаточно информации, чтобы копия «реального» объекта могла быть создана с другой стороны, вот и все. Вероятно, это не требует отправки личных полей. –

+0

@ John/vel/Chris: Я думаю, что этот подход обычно работает (и это то, что я делаю сейчас), но состояние их объекта должно быть сохранено, потому что у этого объекта есть метод, который делает серьезный тяжелый подъем против частных членов. Я нашел обходное решение, в котором я мог бы повторно инициализировать объект с помощью сериализуемых данных (т. Е. Мне повезло), но я думаю, что невозможно сериализовать объект с частными/несериализуемыми зависимостями. – Mayo

0

Другой вариант написать класс прокси, который зеркала свойства типа вы хотите использовать точно, и вернуться, что с помощью WCF.

вы можете использовать AutoMapper для заполнения прокси-объект.

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

Смежные вопросы