Добавление веб-ссылки устанавливает пустой пользовательский класс - PullRequest
1 голос
/ 28 апреля 2011

Моя проблема в том, что у меня есть этот класс:

[SerializableAttribute]
[SoapInclude(typeof(PairColumnValue))]
[XmlInclude(typeof(PairColumnValue))]
public class PairColumnValue:IPairColumnValue
{
    public string ColumnName
    {
        get { return data.Element("ColumnName").Value; }
    }
    public string Value
    {
        get { return data.Element("Value").Value; }
    }


    private XElement data;

    public PairColumnValue()
    {
        data = new XElement("Data", new XElement("ColumnName", ""), new XElement(("Value"), ""));
    }

    public PairColumnValue(string columnName, string value)
    {
        data = new XElement("Data", new XElement("ColumnName", columnName), new XElement(("Value"), value));
    }
}

Этот класс используется в WebService, и когда я добавляю ссылку на службу, сгенерированная ссылка на класс (Reference.cs) выглядит так:

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.4927")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public partial class PairColumnValue {
}

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

PD: чтобы использовать WebReference, я делаю следующее:

        [Test]
    public void InsertThroughService()
    {
        ServiceReference.PairColumnValue[] toInsert = new ServiceReference.PairColumnValue[2];

        toInsert[0] = new PruebasUnitarias.ServiceReference.PairColumnValue("login", "testservice");

        toInsert[1] = new ServiceReference.PairColumnValue("password", "testservice");

        ServiceReference.PersistenceServicev2 client = new PersistenceServicev2();

        XmlSerializer serializer = new XmlSerializer(typeof(PairColumnValue));


        client.InsertData("usuario", toInsert);
    }

И, конечно, в конструкторах написано "Ошибка, класс не содержит конструктора с 2 аргументами.

Помощь! И спасибо, конечно!

1 Ответ

1 голос
/ 28 апреля 2011

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

Ваши свойства доступны только для чтения, поэтому нет способа восстановить (десериализовать) ваш объект; он пропускает эти свойства. Аналогично, пользовательский конструктор - это реализация , а не данные - ему действительно нужен только открытый конструктор без параметров.

Если вы хотите поделиться реализацией, WCF может сделать это с помощью совместного использования сборок (вы используете одну и ту же сборку DTO на обоих концах или определения идентичных типов). Кроме того, сериализатор WCF по умолчанию (DataContractSerializer) устраивает частные средства доступа, поэтому он был бы рад, если бы вы добавили частное set (и указали, что сериализовать через DataContractAttribute / DataMemberAttribute).

...