Проблема сериализации Словарь <string, object> - альтернативные варианты оформления? - PullRequest
1 голос
/ 02 марта 2011

Мне нужно отправить запрос в службу отдыха wcf (4.0).Эта служба будет вызываться как из клиентских приложений (jquery), так и из серверных приложений (asp.net и т. Д.).Служба открывает постоянное хранилище и предоставляет операции CRUD.

У меня проблема с сериализацией.

Я прочитал несколько статей, связанных с этим -> http://blogs.msdn.com/b/youssefm/archive/2009/04/21/understanding-known-types.aspx

public class CustomType
{
    public Dictionary<string,object> CustomObjectCollection {get; set;}
     public SavedBy {get; set;}     
     public SavedOn {get; set;}     


    public CustomType()
    {
        CustomObjectCollection = new Dictionary<string,object>();
    }
}


public class State1
{
    public prop1 {get; set;}
    public prop2 {get; set;}
}

public class State2
{
    public prop1 {get; set;}
    public prop2 {get; set;}
}

Клиент, использующий WCF:

public void save()
{
    CustomType req = new CustomType();
    req.CustomObjectCollection("State1", new State1() {prop1 = val1, prop2 = val2 } ); 
        req.CustomObjectCollection("State2", new State2() {prop1 = val3, prop2 = val4 } ); 

    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(CustomType));
        MemoryStream ms = new MemoryStream();
        serializer.WriteObject(ms, setting);

        string json = Encoding.Default.GetString(ms.ToArray());
        ms.Close();

    Utility.HTTPRequest("http://localhost:2222/MyWCFRestSVC/save", "post", json);

}

Метод WCF:

public bool Save(CustomType req)
{
 /////////
}

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

Я попробовал «Словарь» вместо «Словарь», где я храню строковые представления json os State1 и State2 в качестве значений.Проблема, с которой я столкнулся, заключалась в том, что, когда я использовал DataContractJsonSerializer для сериализации экземпляра CustomType, строки json для State1 & State2 получили встроенные в них обратные слэши (escape-символы) из-за двойной сериализации, я полагаю?

У меня были мысли опользовательская сериализация вместо DataContractJsonSerializer.

Пожалуйста, дайте мне знать ваши мысли.

Спасибо за ваше время.

Ответы [ 3 ]

1 голос
/ 02 марта 2011

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

Под «так, как это было задумано», я имею в виду быстрые поиски. Это хеш-таблица. Вы просто собираете в нее кучу информации только для того, чтобы передать ее своим клиентским приложениям. Так что вам нужно это

List<string, List<object>>

Также убедитесь, что ваш «объект» также сериализуем.

0 голосов
/ 03 марта 2011

Когда в прошлом мне приходилось переносить словарь через WCF / веб-службы, я обычно делил на подклассы из словаря и затем реализовывал интерфейс IXmlSerializable - т.е. ReadXml (), WriteXml ()

Это позволяет контролироватьформат сообщения по сети и, если вы знаете тип передаваемых данных, это может привести к более эффективным средствам сериализации.

0 голосов
/ 02 марта 2011

Я задал похожий вопрос некоторое время назад. Прямого ответа нет, но мы нашли обходной путь:

Сериализация IDictionary в WCF

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