Прохождение рекурсивной коллекции через WCF
-
26-09-2019 - |
Вопрос
Я хочу пройти довольно универсальный набор данных через метод 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 или вручную и передача байтового массива через провод.