Медленный конструктор SoapHttpClientProtocol

Я пишу вспомогательный класс для sharedpreferences:

import android.content.Context;
import android.content.SharedPreferences;

/**
 * Created by mete_ on 23.12.2016.
 */
public class HelperSharedPref {

Context mContext;

public HelperSharedPref(Context mContext) {
    this.mContext = mContext;
}

/**
 *
 * @param key Constant RC
 * @param value Only String, Integer, Long, Float, Boolean types
 */
public void saveToSharedPref(String key, Object value) throws Exception {
    SharedPreferences.Editor editor = mContext.getSharedPreferences(key, Context.MODE_PRIVATE).edit();
    if (value instanceof String) {
        editor.putString(key, (String) value);
    } else if (value instanceof Integer) {
        editor.putInt(key, (Integer) value);
    } else if (value instanceof Long) {
        editor.putLong(key, (Long) value);
    } else if (value instanceof Float) {
        editor.putFloat(key, (Float) value);
    } else if (value instanceof Boolean) {
        editor.putBoolean(key, (Boolean) value);
    } else {
        throw new Exception("Unacceptable object type");
    }

    editor.commit();
}

/**
 * Return String
 * @param key
 * @return null default is null
 */
public String loadStringFromSharedPref(String key) throws Exception {
    SharedPreferences prefs = mContext.getSharedPreferences(key, Context.MODE_PRIVATE);
    String restoredText = prefs.getString(key, null);

    return restoredText;
}

/**
 * Return int
 * @param key
 * @return null default is -1
 */
public Integer loadIntegerFromSharedPref(String key) throws Exception {
    SharedPreferences prefs = mContext.getSharedPreferences(key, Context.MODE_PRIVATE);
    Integer restoredText = prefs.getInt(key, -1);

    return restoredText;
}

/**
 * Return float
 * @param key
 * @return null default is -1
 */
public Float loadFloatFromSharedPref(String key) throws Exception {
    SharedPreferences prefs = mContext.getSharedPreferences(key, Context.MODE_PRIVATE);
    Float restoredText = prefs.getFloat(key, -1);

    return restoredText;
}

/**
 * Return long
 * @param key
 * @return null default is -1
 */
public Long loadLongFromSharedPref(String key) throws Exception {
    SharedPreferences prefs = mContext.getSharedPreferences(key, Context.MODE_PRIVATE);
    Long restoredText = prefs.getLong(key, -1);

    return restoredText;
}

/**
 * Return boolean
 * @param key
 * @return null default is false
 */
public Boolean loadBooleanFromSharedPref(String key) throws Exception {
    SharedPreferences prefs = mContext.getSharedPreferences(key, Context.MODE_PRIVATE);
    Boolean restoredText = prefs.getBoolean(key, false);

    return restoredText;
}

}
30
задан yerfdog 24 March 2011 в 21:33
поделиться

4 ответа

Следующий текст взят из этой ветки на форумах VMWare:

Привет, ребята,

Мы обнаружили, что sgen.exe действительно работает. Просто есть пара дополнительных шагов помимо предварительной генерации dll сериализатора, которые мы пропустили в этом потоке. Вот подробная инструкция

ПРОБЛЕМА

При использовании VIM 2.0 SDK из .NET требуется много времени для создания экземпляра класса VimService. (Класс VimService - это прокси-класс, созданный при запуске 'wsdl.exe vim.wsdl vimService.wsdl')

Другими словами, следующая строка кода:

_service = new VimService();

Может занять около 50 секунд для выполнения.

ПРИЧИНА

Очевидно, .NET XmlSerializer использует атрибуты System.Xml.Serialization. * , аннотирующие прокси-классы для генерации кода сериализации во время выполнения. Когда прокси-классов много и они велики, как и код в VimService.cs, создание кода сериализации может занять много времени.

РЕШЕНИЕ

Это известная проблема работы сериализатора Microsoft .NET. .

Вот некоторые ссылки, которые MSDN предоставляет по решению этой проблемы:

http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx http://msdn2.microsoft.com /en-us/library/system.xml.serialization.xmlserializerassemblyattribute.aspx

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

Полное исправление включает следующие шаги:

  1. Создание сборки (DLL) с предварительно сгенерированным кодом сериализатора XML.

  2. Удаление всех ссылок на System.Xml.Serialization. * Атрибуты из прокси-кода (т.е. из файла VimService.cs)

  3. Добавьте аннотацию к основному прокси-классу с помощью атрибута XmlSerializerAssemblyAttribute, чтобы указать ему, где находится сборка сериализатора XML.

Пропуск шага 2 приводит только к 20% сокращению времени создания экземпляра для Класс VimService . Пропуск шага 1 или 3 приводит к неверному коду. На всех трех этапах достигается 98% улучшение.

Вот пошаговые инструкции:

Прежде чем начать, убедитесь, что вы используете инструменты .NET версии 2.0. Это решение не будет работать с .NET версии 1.1, потому что инструмент sgen и XmlSerializationAssemblyAttribute доступны только в версии 2.0 .NET

  1. Создайте файл VimService.cs из WSDL с помощью wsdl.exe :

    wsdl.exe vim.wsdl vimService.wsdl

    Будет выведена служба VimService. cs в текущем каталоге

  2. Скомпилируйте VimService.cs в библиотеку

    csc / t: library /out:VimService.dll VimService.cs

  3. Используйте инструмент sgen для предварительного создания и компиляции сериализаторов XML:

    sgen / p VimService.dll

    Это выведет VimService.XmlSerializers.dll в текущем каталоге

  4. Вернитесь к файлу VimService.cs и удалите все System.Xml.Serialization. * атрибутов. Поскольку код кода велик, лучший способ добиться этого - использовать какой-нибудь инструмент подстановки регулярных выражений. Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    cs в библиотеку

    csc / t: library /out:VimService.dll VimService.cs

  5. Используйте инструмент sgen для предварительного создания и компиляции сериализаторов XML:

    sgen / p VimService.dll

    Это выведет VimService.XmlSerializers.dll в текущий каталог

  6. . Вернитесь к файлу VimService.cs и удалите все атрибуты System.Xml.Serialization. * . Поскольку код кода велик, лучший способ добиться этого - использовать какой-нибудь инструмент подстановки регулярных выражений. Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    cs в библиотеку

    csc / t: library /out:VimService.dll VimService.cs

  7. Используйте инструмент sgen для предварительного создания и компиляции сериализаторов XML:

    sgen / p VimService.dll

    Это выведет VimService.XmlSerializers.dll в текущий каталог

  8. . Вернитесь к файлу VimService.cs и удалите все атрибуты System.Xml.Serialization. * . Поскольку код кода велик, лучший способ добиться этого - использовать какой-нибудь инструмент подстановки регулярных выражений. Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    cs

  9. Используйте инструмент sgen для предварительного создания и компиляции XML-сериализаторов:

    sgen / p VimService.dll

    Это выведет VimService.XmlSerializers.dll в текущий каталог

  10. Вернитесь к Файл VimService.cs и удалите все атрибуты System.Xml.Serialization. * . Поскольку код кода велик, лучший способ добиться этого - использовать какой-нибудь инструмент подстановки регулярных выражений. Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    cs

  11. Используйте инструмент sgen для предварительного создания и компиляции XML-сериализаторов:

    sgen / p VimService.dll

    Это выведет VimService.XmlSerializers.dll в текущий каталог

  12. Вернитесь к Файл VimService.cs и удалите все атрибуты System.Xml.Serialization. * . Поскольку код кода велик, лучший способ добиться этого - использовать какой-нибудь инструмент подстановки регулярных выражений. Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    dll в текущем каталоге

  13. Вернитесь к файлу VimService.cs и удалите все атрибуты System.Xml.Serialization. * . Поскольку код кода велик, лучший способ добиться этого - использовать какой-нибудь инструмент подстановки регулярных выражений. Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    dll в текущем каталоге

  14. Вернитесь к файлу VimService.cs и удалите все атрибуты System.Xml.Serialization. * . Поскольку код кода велик, лучший способ добиться этого - использовать какой-нибудь инструмент подстановки регулярных выражений. Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    Будьте осторожны, поскольку не все атрибуты появляются в строке сами по себе. Некоторые из них встроены как часть объявления метода.

    Если вы находите этот шаг трудным, вот упрощенный способ его выполнения:

    Предполагая, что вы пишете C #, выполните глобальную замену следующей строки:

    [System.Xml.Serialization.XmlIncludeAttribute

    и замените его на:

    // [System.Xml.Serialization.XmlIncludeAttribute

    Это позволит избавиться от Xml.Serialization атрибуты, которые являются основными виновниками замедления, путем их комментариев. Если вы используете какой-либо другой язык .NET, просто измените заменяемую строку, чтобы она была закомментирована префиксом в соответствии с синтаксисом этого языка. Этот упрощенный подход даст вам максимальное ускорение, которое вы можете получить. Удаление остальных атрибутов Xml.Serialization дает дополнительное ускорение только на 0,2 секунды.

  15. Добавьте следующий атрибут к классу VimService в VimService.cs:

    [System.Xml.Serialization.XmlSerializerAssemblyAttribute (AssemblyName = "VimService.XmlSerializers")]

    У вас должно получиться что-то вроде этого:

    // ... Здесь какой-то код ... [System.Xml.Serialization.XmlSerializerAssemblyAttribute (AssemblyName = "VimService.XmlSerializers")] общедоступный частичный класс VimService: System.Web.Services.Protocols.SoapHttpClientProtocol { // ... Больше кода здесь

  16. Регенерировать библиотеку VimSerice.dll с помощью

    csc / t: library /out:VimService.dll VimService.cs

  17. Теперь из вашего приложения вы можете добавить ссылку на VimSerice .dll библиотека.

  18. Запустите приложение и убедитесь, что время создания объекта VimService сокращено.

ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ

Инструмент sgen - это что-то вроде черного ящика, и его поведение зависит от того, что у вас есть на вашем компьютере .config файл. Например, по умолчанию предполагается вывод оптимизированного неотладочного кода, но это не всегда так. Чтобы получить некоторое представление об инструменте, используйте флаг / k на шаге 3, который заставит его сохранить все свои временные сгенерированные файлы, включая исходные файлы и файлы параметров командной строки, которые он сгенерировал.

Даже после вышеуказанного исправления время, необходимое для создания экземпляра класса VimService в первый раз, не является мгновенным (1,5 секунды). Основываясь на эмпирических наблюдениях, кажется, что большая часть оставшегося времени связана с обработкой атрибутов SoapDocumentMethodAttribute . На данный момент неясно, как это время можно сократить. Предварительно сгенерированная сборка XmlSerializer не учитывает атрибуты, связанные с SOAP, поэтому эти атрибуты должны оставаться в коде. Хорошей новостью является то, что только первое создание экземпляра класса VimService для этого приложения занимает много времени. Поэтому, если дополнительные 1,5 секунды являются проблемой, можно попытаться создать фиктивный экземпляр этого класса в начале приложения в качестве средства для улучшения пользовательского опыта времени входа в систему.

похоже, что большая часть оставшегося времени связана с обработкой атрибутов SoapDocumentMethodAttribute . На данный момент неясно, как это время можно сократить. Предварительно сгенерированная сборка XmlSerializer не учитывает атрибуты, связанные с SOAP, поэтому эти атрибуты должны оставаться в коде. Хорошей новостью является то, что только первое создание экземпляра класса VimService для этого приложения занимает много времени. Поэтому, если дополнительные 1,5 секунды являются проблемой, можно попытаться создать фиктивный экземпляр этого класса в начале приложения в качестве средства для улучшения пользовательского опыта времени входа в систему.

похоже, что большая часть оставшегося времени связана с обработкой атрибутов SoapDocumentMethodAttribute . На данный момент неясно, как это время можно сократить. Предварительно сгенерированная сборка XmlSerializer не учитывает атрибуты, связанные с SOAP, поэтому эти атрибуты должны оставаться в коде. Хорошей новостью является то, что только первое создание экземпляра класса VimService для этого приложения занимает много времени. Поэтому, если дополнительные 1,5 секунды являются проблемой, можно попытаться создать фиктивный экземпляр этого класса в начале приложения в качестве средства для улучшения пользовательского опыта времени входа в систему.

Предварительно сгенерированная сборка XmlSerializer не учитывает атрибуты, связанные с SOAP, поэтому эти атрибуты должны оставаться в коде. Хорошей новостью является то, что только первое создание экземпляра класса VimService для этого приложения занимает много времени. Поэтому, если дополнительные 1,5 секунды являются проблемой, можно попытаться создать фиктивный экземпляр этого класса в начале приложения в качестве средства для улучшения пользовательского опыта времени входа в систему.

Предварительно сгенерированная сборка XmlSerializer не учитывает атрибуты, связанные с SOAP, поэтому эти атрибуты должны оставаться в коде. Хорошей новостью является то, что только первое создание экземпляра класса VimService для этого приложения занимает много времени. Поэтому, если дополнительные 1,5 секунды являются проблемой, можно попытаться создать фиктивный экземпляр этого класса в начале приложения в качестве средства для улучшения пользовательского опыта времени входа в систему.

37
ответ дан 28 November 2019 в 00:11
поделиться

Я полагаю, что это не проблема SGEN. Я посмотрел на код конструктора, и я вижу, что он делает большое отражение (на основе XmlIncludeAttribute на классе). Это размышляет над всеми ними и может действительно занять много времени.

1
ответ дан 24 March 2011 в 21:33
поделиться

Вы могли бы хотеть изучить Sgen.exe инструмент, который идет с.NET. Существует также удобная небольшая вещь на странице "Build" свойств проекта Visual Studio C#, в самой нижней части, названной "Блок сериализации сборки", который автоматически работает Sgen за Вами.

1
ответ дан Alex Lyman 24 March 2011 в 21:33
поделиться
  • 1
    Довольный помочь! @xaragen этим утром я был в паническом режиме.. так как я должен был выпустить приложение.. плохая идея, делающая обновление.. прежде:-) – Luca Sepe 27 June 2014 в 16:24

Существует предварительно сгенерированный блок XmlSerializer, который идет с CRM. Проверьте, чтобы видеть, есть ли у Вас SdkTypeProxy.XmlSerializers.dll и SdkProxy.XmlSerializers.dll в GAC.

, Если Вы не делаете затем, это означает, что при создании CrmService .NET генерирует блок XmlSerializer, который может занять время. Надежда это помогает

1
ответ дан 25 March 2011 в 07:33
поделиться
  • 1
    Та форма является последними инструментами сборки? Я портировал мой от моего ПК Работы, который имеет annotations.jar от версии 22. – RED_ 27 June 2014 в 19:57
Другие вопросы по тегам:

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