Вопрос

Я хочу пройти довольно универсальный набор данных через метод WCF. Данные в основном просто иерархический набор пар ключевых / значений, но он вложен до произвольного уровня. Первоначально я считал проходящим его как одну строку и делать XML или JSON или аналогичную кодировку / декодирование на любом конце, но поскольку транспортировка WCF - это XML в любом случае, которое казалось немного глупым, поэтому я надеюсь, что есть способ пройти через это «Естественно».

Метод довольно прост:

[OperationContract]
void ProcessData(DataTree tree);

с:

public class DataTree : Dictionary<string, DataTree>
{
}

Это все компилируется нормально, но когда я стараюсь запустить сервис, он вылетает с помощью StackoverFlowException под datacontract.getstablename.

Я пытался положить [CollectionDataContract] атрибут на то DataTree Класс и явно указывая все имена, но это не имело никакого значения.

Я также пытался положить [DataContract] на нем, но потом это терпит неудачу даже раньше, потому что Dictionary является ISerializable.

Любые идеи? Есть лучший способ это сделать?

Это было полезно?

Решение 2

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

[CollectionDataContract(IsReference = true, ItemName = "Param",
                        KeyName = "Name", ValueName = "Data")]
public class DataTree : Dictionary<string, DataTreeEntry>
{
}

[DataContract]
public class DataTreeEntry
{
    [DataMember]
    public string Value { get; set; }

    [DataMember]
    public DataTree Children { get; set; }
}

Другие советы

Для больших деревьев объектов в прошлом я сериализовал данные сам к байтовому массиву, который отправляется с WCF (и WCF, не должен быть SOAP / XML, если у вас есть WCF в обоих концах), а затем десериализовали его вручную приемный конец.

В основном создать а Serialize(BinaryWriter writer) и DeSerialize(BinaryReader reader) Для классов в вопросе, который сериализуется и передает писатель / читателя до дочерних объектов для рекурсивной сериализации.

Вы также можете посмотреть на использование Protobuf-Net. для сериализации / десериализации. Либо в качестве транспорта на вашем вызове WCF или вручную и передача байтового массива через провод.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top