Сериализация делегата в WCF - PullRequest
2 голосов
/ 06 апреля 2011

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

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

Я украсил структуры с помощью [Serializable], но это не работает.Вот пример одного из них:

[Serializable]
public delegate bool ValidationDelegateInt( pdInt structure );

[Serializable]
public struct pdInt
{
    public pdInt(int i, bool b, int rh, int rl, bool mv, bool va, ValidationDelegateInt v)
    {
        Value = i;
        IsRequired = b;
        RangeHigh = rh;
        RangeLow = rl;
        MustValidate = mv;
        IsValidated = va;
        Validate = v;
    }

    public int Value;
    public bool IsRequired;
    public int RangeHigh;
    public int RangeLow;
    public bool MustValidate;
    public bool IsValidated;
    public ValidationDelegateInt Validate;
}

Вот фрагмент, демонстрирующий, как я их объявляю:

[Serializable]
public class PDUser : Person, IValidate
{
    #region Members

    public pdInt SomeRange;
    public pdString SomeString;

Вот код, который иллюстрирует, как я хочу использоватьих на клиенте.

    private void bPDUserSelfDL_Click( object sender, EventArgs e )
    {
        Model.PDUser p = new Model.PDUser();
        p.Self( 4 );
        p.SomeRange.Value = 1;

        if ( p.SomeRange.MustValidate )
        {
            bool IsValid = p.SomeRange.Validate( p.SomeRange );
        }

    }

Вот контракт данных:

[DataContract( Name = "PDUserSelfResultSet", Namespace = "V_1" )]
public class PDUserSelfResultSet
{
    List<PDUser> m_PDUsers;

    [DataMember]
    public List<PDUser> PDUsers
    {
        get
        {
            return m_PDUsers;
        }
        set
        {
            m_PDUsers = value;
        }
    }
}

и в моем сервисе, вот как я его использую:

    public PDUserSelfResultSet PDUserSelf( int PersonID )
    {
        try
        {
            PDUserSelfResultSet s = new PDUserSelfResultSet();
            s.PDUsers = new List<PDUser>();

            PDUser p = new PDUser();
            s.PDUsers.Add( p.Self( PersonID ));

            return s;
        }
        catch ( System.Net.WebException we )
        {
            string s = we.Message;
            throw we;
        }
        catch ( FaultException fe )
        {
            string s = fe.Message;
            throw fe;
        }
        catch ( Exception e )
        {
            string s = e.Message;
            throw e;
        }
    }

И на клиенте, наконец, вот как я это называю:

    private void Testing()
    {
        WCFHostServiceClient proxy = new WCFHostServiceClient();

        try
        {
            PDUserSelfResultSet r = new PDUserSelfResultSet();
            r = proxy.PDUserSelf( 4 );
            List<PDUser> p = r.PDUsers.ToList<PDUser>();
            proxy.Close();
        }
        catch ( System.Net.WebException we )
        {
            string s = we.Message;
        }
        catch ( System.ServiceModel.CommunicationException ce )
        {
            string s = ce.Message;
        }
    }

Если я закомментирую структуры в моем классе PDUser, то в моем методе Testing () вызов завершится успешно.Если я оставлю структуры в, я получу CommunicationException, что в данном случае означает, что WCF не знает, как обращаться со структурой.

Кто-нибудь знает, как создать контракт данных, чтобы яможно использовать структуры?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Проблема с использованием структур в WCF была связана не столько с самими структурами, сколько с тем, что было в них. У меня был делегат, и это было причиной проблемы. Более общая проблема заключается в том, что делегат не совместим с функциональной совместимостью. В какой-то момент мой клиент захочет поддерживать iPad и другие планшеты, и они не используют .NET, поэтому выяснить, как поддержать делегатов в WCF, будет контрпродуктивно.

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