Сериализируйте Объект Платформы Объекта использование Json. Сеть

Я думаю, что быстрый ответ для получения первого символа может быть:

let firstCharacter = aString[aString.startIndex]

Это намного элегантнее и эффективнее, чем:

let firstCharacter = Array(aString.characters).first

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

extension String {
var length : Int {
    return self.characters.count
}

subscript(integerIndex: Int) -> Character {
    let index = startIndex.advancedBy(integerIndex)
    return self[index]
}

subscript(integerRange: Range<Int>) -> String {
    let start = startIndex.advancedBy(integerRange.startIndex)
    let end = startIndex.advancedBy(integerRange.endIndex)
    let range = start..<end
    return self[range]
}

}

НО ЭТО УЖАСНАЯ ИДЕЯ !!

Расширение ниже ужасно неэффективно. Каждый раз, когда к строке обращаются с помощью целого числа, запускается функция O (n) для продвижения ее начального индекса. Запуск линейного цикла внутри другого линейного цикла означает, что этот цикл for случайно равен O (n2) - при увеличении длины строки время, которое занимает этот цикл, увеличивается квадратично.

Вместо этого вы можете использовать коллекцию строк символов.

8
задан Hitesh 24 June 2009 в 04:20
поделиться

1 ответ

Похоже, у вас та же общая проблема, что и у исходного сериализатора DataContract, в отношении циклических ссылок. Хотя объекты, ссылающиеся друг на друга, довольно часто встречаются с графами объектов в памяти, такие циклические ссылки неизбежно приводят к бесконечным рекурсиям при сериализации, если сериализатор не учитывает это специально. Существует несколько установленных стандартов для работы с циклическими ссылками в распространенных небинарных форматах сериализации (XML и JSON являются двумя наиболее распространенными).

Microsoft решила циклическую проблему для сериализатора DataContract в .NET 3.5 SP1. за счет использования семантики ref в xml. Насколько мне известно, для JSON такого нет, и, возможно, именно поэтому JSON.NET не позволяет вам сериализовать граф объекта.

Я бы удостоверился, что в вашем графе объектов есть только ссылки, по которым можно перемещаться в одном направлении, а не в обоих направлениях (т.е. только от родителя к потомку, а не от ребенка к родителю). Эти родительский / дочерний и дочерний / родительский типы являются наиболее распространенные типы циклических ссылок. Также может случиться так, что дочерний элемент нижнего уровня в конечном итоге ссылается на корень графа, вызывая создание косвенного циклического графа (однако, они, как правило, гораздо реже, чем циклы родительский / дочерний).

Как только вы Удалите любые циклические ссылки в графе объектов, вы сможете сериализовать.

Я бы удостоверился, что в вашем графе объектов есть только ссылки, по которым можно перемещаться в одном направлении, а не в обоих направлениях (т.е. только от родителя к потомку, а не от ребенка к родителю). Эти родительский / дочерний и дочерний / родительский типы являются наиболее распространенные типы циклических ссылок. Также может случиться так, что дочерний элемент нижнего уровня в конечном итоге ссылается на корень графа, вызывая создание косвенного циклического графа (однако, они, как правило, гораздо реже, чем циклы родительский / дочерний).

Как только вы Удалите любые циклические ссылки в графе объектов, вы сможете сериализовать.

Я бы удостоверился, что в вашем графе объектов есть только ссылки, по которым можно перемещаться в одном направлении, а не в обоих направлениях (т.е. только от родителя к потомку, а не от ребенка к родителю). Эти родительский / дочерний и дочерний / родительский типы являются наиболее распространенные типы циклических ссылок. Также может случиться так, что дочерний элемент нижнего уровня в конечном итоге ссылается на корень графа, вызывая создание косвенного циклического графа (однако, они, как правило, гораздо реже, чем циклы родительский / дочерний).

Как только вы Удалите любые циклические ссылки в графе объектов, вы сможете сериализовать.

7
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

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