Передача рекурсивной коллекции через WCF - PullRequest
2 голосов
/ 02 сентября 2010

Я хочу передать довольно общий набор данных через метод 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 ]

1 голос
/ 06 сентября 2010

Как оказалось, появилось еще одно требование (указав простое значение для узла в дополнение к списку дочерних элементов), поэтому я все равно определил дочерний тип для него, что, по-видимому, порадовало 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; }
}
1 голос
/ 02 сентября 2010

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

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

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

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