конструктор не отображается в моем клиенте WCF, проблема с сериализацией? - PullRequest
4 голосов
/ 18 ноября 2008

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

В моем классе 4 открытых свойства типа string.

Я пометил класс с помощью [DataContract ()], а каждый член - с помощью [DataMember].

Почему мой конструктор не виден? Есть ли специальный [атрибут] для конструкторов?

Ответы [ 4 ]

8 голосов
/ 18 ноября 2008

Контракты с данными не имеют ничего общего с конструкторами. Поэтому, когда вы создаете свой прокси на клиенте, вы получите только класс, реализующий контракт данных.

Если вы хотите добавить аналогичный конструктор на стороне клиента (предположим, что сгенерированный тип называется SomeDataItem), вы можете добавить его, используя частичный класс:

public partial class SomeDataItem
{
    public SomeDataItem(int a, int b)
    {
        A = a;
        B = b;
    }
}
6 голосов
/ 04 февраля 2010

Согласитесь, что вы можете добавить частичный класс в приложение на стороне клиента WCF - вы также можете добавить методы [OnDeserializing] и [OnDeserialized] в класс на стороне сервера для обработки инициализаций и т. Д.

Нашел следующий замечательный пример, когда я искал способ решения этой проблемы - на http://social.msdn.microsoft.com/forums/en-US/wcf/thread/447149d5-b44c-47cd-a690-20928244b52b/

[DataContract]
public class MyClassWithSpecialInitialization
{
    List<string> myList;
    string str1;
    [DataMember]
    public string Str1
    {
        get { return str1; }
        set
        {
            this.myList.Add(value);
            str1 = value;
        }
    }
    string str2;
    [DataMember]
    public string Str2
    {
        get { return str2; }
        set
        {
            this.myList.Add(value);
            str2 = value;
        }
    }
    public MyClassWithSpecialInitialization()
    {
        this.myList = new List<string>();
    }
    [OnDeserializing]
    public void OnDeserializing(StreamingContext context)
    {
        Console.WriteLine("Before deserializing the fields");
        this.myList = new List<string>();
    }
    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
        Console.WriteLine("After deserializing the fields... myList should be populated with the values of str1 and str2");
    }
}
1 голос
/ 18 ноября 2008

Как вы генерируете свой клиентский код: VS Add Service Reference, SVCUTIL? Какие параметры / настройки вы используете? Вы просматривали код клиента, чтобы увидеть, что на самом деле создается?

Правильно ли используется ваш класс в службе? У меня была проблема, когда я создал открытый класс контракта данных, но не использовал его в методе службы, поэтому класс не был экспортирован в код клиента.

0 голосов
/ 18 ноября 2008

Скобки не требуются, когда вы помечаете класс как контракт данных. Можете ли вы предоставить пример кода вашего класса?

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