Расположение памяти массива.NET

Возврат правильного формата осуществляется форматом медиа-типа. Как уже упоминалось, вы можете сделать это в классе WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...

        // Configure Web API to return JSON
        config.Formatters.JsonFormatter
        .SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

        ...
    }
}

Для получения дополнительной информации проверьте:

В случае, если ваши действия возвращают XML (который это по умолчанию), и вам нужен только специальный метод для возврата JSON, вы можете использовать ActionFilterAttribute и применить его к этому конкретному действию.

Атрибут фильтра:

public class JsonOutputAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
        var value = content.Value;
        Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0];

        var httpResponseMsg = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            RequestMessage = actionExecutedContext.Request,
            Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null)
        };

        actionExecutedContext.Response = httpResponseMsg;
        base.OnActionExecuted(actionExecutedContext);
    }
}

Применение к действию:

[JsonOutput]
public IEnumerable GetPersons()
{
    return _repository.AllPersons(); // the returned output will be in JSON
}

Обратите внимание, что вы можете опустить слово Attribute в декорации действия и использовать только [JsonOutput] вместо [JsonOutputAttribute].

40
задан Lasse Vågsæther Karlsen 28 January 2009 в 20:44
поделиться

4 ответа

Большой вопрос. Я нашел этот статья, которая содержит блок-схемы и для типов значения и для ссылочных типов. Также посмотрите этот статья , в которой Ritcher заявляет:

[надрез] каждый массив имеет некоторую дополнительную служебную информацию, связанную с ним. Эта информация содержит разряд массива (количество размеров), нижние границы для каждого размера массива (почти всегда 0), и длина каждого размера. Издержки также содержат тип каждого элемента в массиве.

7
ответ дан Xiaoy312 5 August 2019 в 15:28
поделиться

Один способ исследовать это состоит в том, чтобы посмотреть на код в WinDbg. Так, учитывая код ниже, давайте посмотрим, как это появляется на "куче".

var numbers = new Int32[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

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

От адреса мы можем вывести фактический экземпляр, который дает нам:

0:000> !do 0x0141ffc0
Name: System.Int32[]
MethodTable: 01309584
EEClass: 01309510
Size: 52(0x34) bytes
Array: Rank 1, Number of elements 10, Type Int32
Element Type: System.Int32
Fields:
None

Это говорит нам, что это - наш массив Int32 с 10 элементами и общим размером 52 байтов.

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

0:000> d 0x0141ffc0
0141ffc0 [84 95 30 01 0a 00 00 00-00 00 00 00 01 00 00 00  ..0.............
0141ffd0  02 00 00 00 03 00 00 00-04 00 00 00 05 00 00 00  ................
0141ffe0  06 00 00 00 07 00 00 00-08 00 00 00 09 00 00 00  ................
0141fff0  00 00 00 00]a0 20 40 03-00 00 00 00 00 00 00 00  ..... @.........
01420000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01420010  10 6d 99 00 00 00 00 00-00 00 01 40 50 f7 3d 03  .m.........@P.=.
01420020  03 00 00 00 08 00 00 00-00 01 00 00 00 00 00 00  ................
01420030  1c 24 40 03 00 00 00 00-00 00 00 00 00 00 00 00  .$@.............

я вставил скобки для 52 байтов.

  • первые четыре байта являются ссылкой на таблицу метода по телефону 01309584.
  • Затем четыре байта для Длины массива.
  • После этого числа от 0 до 9 (каждый четыре байта).
  • последние четыре байта являются пустыми. Я не совсем уверен, но я предполагаю, что это должно быть то, где ссылка на массив syncblock хранится, если экземпляр используется для блокировки.

Редактирование: Забыл длину в первой регистрации.

список является немного неправильным, потому что, поскольку romkyns указывает, что экземпляр на самом деле начинается в адресе - 4, и первым полем является Syncblock.

19
ответ дан Brian Rasmussen 5 August 2019 в 15:28
поделиться

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

0
ответ дан AnthonyWJones 5 August 2019 в 15:28
поделиться

Большой вопрос! Я хотел видеть его для меня, и это казалось хорошей возможностью испытать CorDbg.exe...

кажется, что для простых целочисленных массивов, формат:

ssssllll000011112222....nnnn0000

, где s является синхронизирующим блоком, l длина массива и затем отдельные элементы. Кажется, что существует наконец 0 в конце, я не уверен, почему это.

Для многомерных массивов:

ssssttttl1l1l2l2????????
    000011112222....nnnn000011112222....nnnn....000011112222....nnnn0000

то, где s является синхронизирующим блоком, t общее число элементов, l1 длина первого размера, l2 длина второго размера, затем два, обнуляет?, сопровождаемый всеми элементами последовательно и наконец нулем снова.

Объектные массивы рассматривают как целочисленный массив, содержание является ссылками на этот раз. Зубчатые массивы являются объектными массивами, где ссылки указывают на другие массивы.

6
ответ дан Eric Minkes 5 August 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: