Статьи

Эффективная сериализация данных в WP7 с использованием JSON и ASP.NET MVC

В прошлом году на PDC’10 Microsoft представила свое новое решение для совместного использования сборок между различными платформами (Windows Phone, Silverlight и .NET), получившее название Portable Library Projects . Дата релиза — H1 2011, так что, надеюсь, они все еще на пути, возможно даже будут включены в VS 2010 SP1. До тех пор мы сами по себе …

Дерик Бэйли на самом деле вызвал этот пост из своего твита немного назад, поэтому я решил поделиться решением, которое я использовал для Bus Watch Chicago .

образ

 

Шаг 1: определите ваши сущности / модель в проекте клиента (WP7)

Домен для Bus Watch является общественным транспортом, поэтому, естественно, некоторые из моих объектов — Маршруты, Остановки, Транспортные средства, Местоположения и т. Д. Я определяю все эти классы в проекте WP7; Класс Route можно увидеть ниже.

Зоркий глаз, возможно, заметил, что я определил Route как частичный класс, я остановлюсь на этом в шаге 5.

образ

 

Шаг 2: добавьте «ссылку» на класс модели в вашем веб-проекте

В вашем веб-проекте (в моем случае ASP.NET MVC) щелкните правой кнопкой мыши папку ваших моделей и выберите Добавить -> Существующий элемент …

Затем перейдите в папку «Клиент» и выберите сущности, которые вы планируете сериализовать и представить своему клиенту, но не просто нажмите кнопку Добавить! Рядом с кнопкой «Добавить» находится стрелка раскрывающегося списка, откройте ее и убедитесь, что вы нажимаете « Добавить как ссылку».

образ

Обратите внимание, что файлы имеют небольшие «ярлыки» на своих значках.

образ

 

Шаг 3: сериализация вашей модели как JSON с контроллера MVC

Обратите внимание на то, как я использую проекции LINQ для преобразования моего «DbRoute» в маршрут, который можно красиво сериализовать в JSON в формате, ожидаемом моим клиентом.

[OutputCache(Duration = 10000, VaryByParam = "*")]
public ActionResult GetRoutes()
{
    var db = new CtaEntitiesDataContext();
    var routes = db.DbRoutes
                    .OrderBy(r => r.Number)
                    .Select(r => new Route
                                        {
                                            RouteId = r.RouteId,
                                            Name = r.Name,
                                            Directions = r.Directions,
                                            Number = r.Number
                                        });
 
    return Json(routes, JsonRequestBehavior.AllowGet);
}

Шаг 4: десериализовать JSON на клиенте

Я использую SerializationHelper для переноса стандартного DataContractJsonSerializer, встроенного в .NET, поэтому, пожалуйста, не стесняйтесь его использовать.

public static class SerializationHelper
{
    public static T Deserialize<T>(string serialized)
    {
        if (string.IsNullOrEmpty(serialized))
            return default(T);
 
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(serialized)))
        {
            var ser = new DataContractJsonSerializer(typeof(T));
            return (T)ser.ReadObject(ms);
        }
    }
 
    public static string Serialize<T>(T obj)
    {
        var serializer = new DataContractJsonSerializer(obj.GetType());
        using(var ms = new MemoryStream())
        {
            serializer.WriteObject(ms, obj);
            ms.Position = 0;
            var sr = new StreamReader(ms);
            var json = sr.ReadToEnd();
            sr.Close();
            return json;
        }
    }
}

Затем на моем клиенте я просто преобразовываю сериализованную строку JSON из моего контроллера MVC в IEnumerable <Route>. Используя «ссылку» Route.cs, я гарантирую, что если я добавлю свойство в мой класс Route, оно будет правильно сериализовано и десериализовано на обоих концах передачи.

public IEnumerable<Route> ConvertRoutes(string serialized)
{
    return SerializationHelper.Deserialize<IEnumerable<Route>>(serialized);
}

Шаг 5: свойства / поведение только клиента (необязательно)

Во многих реальных приложениях вам потребуются дополнительные свойства и методы вашей клиентской модели, которые на самом деле не принадлежат на стороне сервера. Для решения этой проблемы мы будем использовать частичные классы.

Обратите внимание, что в обозревателе решений у меня есть RouteClient.cs, который определяет клиентские свойства и методы этой сущности. Например, пользователи Bus Watch могут хранить свои FavoriteStops для заданного маршрута, естественно, все эти данные будут сохранены на стороне клиента приложения и не могут / не должны передаваться с сервера. Используя отдельный файл .cs, который не «связан» на стороне сервера приложения, я гарантирую, что проект WP7 будет взаимодействовать с полным богатством сущности Route, тогда как стороне сервера просто придется беспокоиться о сериализации. и доказывая соответствующие свойства клиенту.

образ

Надеюсь , это поможет кому — то начать работу с wp7dev с помощью ASP.NET MVC

Источник:  http://www.matthidinger.com/archive/2011/02/15/Effectively-serializing-data-to-wp7-using-JSON-and-asp -net.aspx