Actionscript 3.0 XML-файл сохраняется с парой случайных символов в начале файла - PullRequest
0 голосов
/ 12 октября 2011

Я использую этот пример Adobe в разделе «Чтение и запись объектов», чтобы попытаться преобразовать XML-файл в byteArray и сохранить его где-нибудь. Я использую this для загрузки файла в s3. Когда я загружаю файл XML с помощью s3, я получаю 4 случайных символа перед файлом XML. Глядя на проблему [пример того, что я думаю, происходит] , кажется, что дополнительные символы создаются с помощью схемы кодирования. Однако пример adobes использует writeObject для преобразования XML в byteArray, поэтому я не вижу, как я использую неправильную схему кодирования.

мой код довольно прост.

создание byteArray:

            var _bookXml:XML = _book.serialize(); //converts book to XML
                var photobookXmlName:String = photobookToken + "_layout.xml";
                _s3uploader.uploadObjectToS3(_bookXml, photobookXmlName); //uploads XML

и код uploadObjectToS3:

    public function uploadObjectToS3(file:Object, objectName:String):void{
        var data:ByteArray = new ByteArray;
        data.writeObject(file);
        data.position = 0;
        //code to do s3 upload
    }

Вот пример XML-файла до / после, который я использовал в качестве контрольного примера:

перед:

<xml>
  <test>data</test>
</xml>

после

��5<xml>
  <test>data</test>
</xml>

есть идеи, как решить эту проблему, чтобы я не получал случайные символы? Я попробовал несколько вещей, но они не сработали.

спасибо

edit: прежде чем кто-либо предлагал, я уже пытался изменить входную форму uploadObjectToS3 на объект ByteArray. Это ничего не изменило.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Вы используете data.writeObject(file);. Это , а не случайные символы, это маркеры сериализации.

Вы не отправляете XML-документ на S3, вы отправляете сериализованный Actionscript XML объект (в формате AMF3).

_bookXml.toXMLString() выдаст вам XML-документ в виде строки. тогда вы сможете использовать ByteArray.writeMultiByte(), чтобы получить то, что вы хотите. Посмотрите на следующий пример:

    var test:XML = <test><data>Data</data></test>;

    var serializeObject:ByteArray = new ByteArray();
    serializeObject.writeObject(test);
    trace(serializeObject.toString());

    var rawString:ByteArray = new ByteArray();
    rawString.writeMultiByte(test.toXMLString(), 'utf-8');
    trace(rawString.toString());

Вывод:

�E<test>
  <data>Data</data>
</test>

<test>
  <data>Data</data>
</test>

Разница в том, что первым является сериализованный объект (который можно использовать .readObject() для десериализации объекта из байтового массива обратно в XML объект во флэш-памяти). Последний - это просто необработанные байты строки (в utf-8).

В вашем случае я бы предложил что-то вроде этого:

public function uploadObjectToS3(file:Object, objectName:String):void{
    var data:ByteArray = new ByteArray;
    data.writeObject(file);
    data.position = 0;

    uploadByteArrayToS3(data, objectName);
}

public function uploadXmlToS3(file:XML, objectName:String):void{
    var data:ByteArray = new ByteArray;
    data.writeMultiByte(file.toXMLString(), "utf-8");
    data.position = 0;

    uploadByteArrayToS3(data, objectName);
}

private function uploadByteArrayToS3(file:ByteArray, objectName:String):void{
    //code to do s3 upload
}
0 голосов
/ 12 октября 2011

Если вы не получаете префикс Unicode на строку, я полагаю, вы видите длину строки для десериализации.

Это будет показано:

writeUTF (значение: String)- Записывает строку UTF-8 в файловый поток, байтовый поток или байтовый массив.Длина строки UTF-8 в байтах записывается первой в виде 16-разрядного целого числа, за которым следуют байты, представляющие символы строки.

writeUTFBytes (value: String) - записывает UTF-8строка.Аналогичен writeUTF (), но не префикс строки с 16-разрядным словом длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...