def serializeValue(placer, _type, value): """ Сериализовать одно значение. Если значение является простым типом, оно записывается в результат. Если значение является объектом, поддерживающим интерфейс L{ISerializable}, то значением становится сериализованный объект. Если значение является массивом, его значением является массив сериализованных элементов. @param placer: функция, которая обеспечивает помещение сериализованного значения в результат @type placer: C{function(value)} @param _type: тип сериализуемого элемента @param value: сериализуемое значение @return: список L{twisted.internet.defer.Deferred}, по завершении которых результат будет построен @rtype: C{list} """ defer_list = [] if type(_type) is Array: placer = placerList(placer([])) for val in value: defer_list.extend(serializeValue(placer, _type.elementType, val)) elif issubclass(_type, Interface): d = value.serialize() d.addCallback(placer) defer_list.append(d) elif _type is datetime: placer(DateTime.toISO(value)) else: placer(value) return defer_list
def unserializeValue(_type, value): """Восстанавливаем переменную из сериализованного значения """ if type(_type) is Array: return [unserializeValue(_type.elementType, val) for val in value] if issubclass(_type, Interface): serializer = get_serializer(_type) unservalue = serializer.unserialize(value) return unservalue if _type is datetime: return DateTime.fromISO(value) if type(value) is types.UnicodeType: return value.encode('utf-8') return value
def test_fromISO(self): self.assertEquals(datetime.datetime(2008, 06, 18, 10, 37, 33), DateTime.fromISO("20080618T10:37:33"))
def test_toISO(self): self.assertEquals("20080618T10:37:33", DateTime.toISO(datetime.datetime(2008, 06, 18, 10, 37, 33))) self.assertEquals(None, DateTime.toISO(None))