Если вам не нужны тесты в выпуске вашего проекта (которые вы хотите поставить с помощью CPack), тогда условно укажите подкаталог googletest
и установите для параметра false значение false при упаковке:
...
if(NOT DISABLE_TESTS)
add_subdirectory(googletest)
endif()
упаковка с
cmake -DDISABLE_TESTS=ON
cpack
Альтернативно, если вы хотите тесты, но не хотите устанавливать инфраструктуру тестирования, вы можете отключить команду install
посредством определения макроса или функции с тем же именем:
# Replace install() to do-nothing macro.
macro(install)
endmacro()
# Include subproject (or any other CMake code) with "disabled" install().
add_subdirectory(googletest)
# Restore original install() behavior.
macro(install)
_install(${ARGN})
endmacro()
Этот подход также был предложен в рассылке CMake .
Функции не могут быть сериализованы в объект JSON.
Поэтому я предлагаю вам создать отдельный объект (или свойство внутри объекта) для фактических свойств и просто сериализовать эту часть. После этого вы можете создать объект со всеми его функциями и повторно применить все свойства, чтобы восстановить доступ к вашему рабочему объекту.
Следуя вашему примеру, это может выглядеть так:
function MyObject() { this.init(); }
MyObject.prototype = {
data: {
property1: "",
property2: ""
},
init: function () {
this.property1 = "First";
this.property2 = "Second";
},
test: function() {
alert("Executing test!");
},
save: function( id ) {
window.localStorage.setItem( id, JSON.stringify(this.data));
},
load: function( id ) {
this.data = JSON.parse( window.getItem( id ) );
}
}
JSON не сериализует функции.
Взгляните на второй абзац здесь .
Если вам нужно сохранить такие значения , вы можете преобразовывать значения по мере их сериализации или до десериализации, чтобы JSON мог представлять дополнительные типы данных.
blockquote>Другими словами, если вы действительно хотите JSONify функции, вы можете преобразуйте их в строки перед сериализацией:
mo.init = ''+mo.init; mo.test = ''+mo.test;
И после десериализации, преобразуйте их обратно в функции.
mo.init = eval(mo.init); mo.test = eval(mo.test);
Однако для этого не должно быть никаких оснований. Вместо этого вы можете иметь конструктор
MyObject
принять простой объект (как результат синтаксического анализа строки JSON) и скопировать свойства объекта самому себе.
Вы правы, функции отбрасываются. Эта страница может помочь:
"Значения, которые не имеют представления в JSON ( такие как функции и неопределенные) исключаются ».
Это потому, что JSON.stringify()
не сериализует функции, которые я думаю.
Чтобы избежать изменения структуры, я предпочитаю использовать метод Object.assign
для извлечения объекта. Этот метод объединяет второй объект параметра в первом. Чтобы получить объектные методы, нам просто нужен пустой новый объект, который используется в качестве целевого параметра.
var mo = window.localStorage.getItem("myObject");
// this object has properties only
mo = JSON.parse(mo);
// this object will have properties and functions
var completeObject = Object.assign(new MyObject(), mo);
Обратите внимание, что первый параметр Object.assign
изменен и возвращен функцией.