Zurück   Flashforum > Flex und AIR > Adobe AIR

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-01-2010, 14:31   #1 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.407
Eigene Objekte + EncryptedLocalStore ?

Hallo zusammen,

ich versuche gerade eine Variable vom Typ "Point" in den EncryptedLocalStore zu schreiben.

Das Schreiben funktioniert auch ohne Probleme. Will ich mir das Ergebnis tracen lassen, kommt allerdings immer ein String heraus. (Egal wie ich caste)


Wie stelle ich es an, dass ich einen "Point" zurückbekomme ?

Meine "read" Methode sieht zB. so aus:

ActionScript:
  1. public function write( _value:*, _name:String):void
  2.         {
  3.             var bytes:ByteArray = new ByteArray();
  4.             bytes.writeUTFBytes(_value);
  5.             EncryptedLocalStore.setItem( _name, bytes);
  6.             trace("saved");
  7.         }
( "*" weil ich viele verschiedene Dinge in meiner Appliktion reinschreiben will)

Meine Write Methode

ActionScript:
  1. public function read( _name:String ):*
  2.         {
  3.             var storedValue:ByteArray = new ByteArray();
  4.            
  5.             if(  EncryptedLocalStore.getItem( _name ) != null)
  6.             {
  7.                 storedValue = EncryptedLocalStore.getItem( _name );
  8.                 var storedReturnData:*  = storedValue.readUTFBytes(storedValue.length);
  9.                 return storedReturnData;
  10.             }
  11.             else
  12.             {
  13.                 return null;
  14.             }
  15.         }

Grüße, nico
__________________
Mein Blog
Freue mich über jeden Besucher. :)

Geändert von Nico B. (26-01-2010 um 14:37 Uhr)
Nico B. ist gerade online   Mit Zitat antworten
Alt 26-01-2010, 14:44   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Schaue dir mal die registerClassAlias Methode an.
Omega Psi ist offline   Mit Zitat antworten
Alt 26-01-2010, 15:07   #3 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.407
Ich entmülle mal eben:

Habe diesen Link gefunden:
http://cookbooks.adobe.com/post_Stor...oca-10563.html

Und dementsprechend dieses Beispiel gebaut:

ActionScript:
  1. package
  2. {
  3.     import de.nicobarelmann.LOL;
  4.     import flash.data.EncryptedLocalStore;
  5.     import flash.display.Sprite;
  6.     import flash.utils.ByteArray;
  7.    
  8.     public class Main extends Sprite
  9.     {
  10.         public function Main()
  11.         {      
  12.             var lol:LOL = new LOL("Hallo");
  13.             var bytes:ByteArray = new ByteArray();
  14.             bytes.writeObject( lol );
  15.             EncryptedLocalStore.setItem( "contactkey", bytes );
  16.             read();
  17.         }
  18.        
  19.         private function read():void
  20.         {
  21.             var bytes:ByteArray = EncryptedLocalStore.getItem( "contactkey" );
  22.             var lol:LOL = bytes.readObject(bytes.length) as LOL;
  23.             trace(lol);
  24.         }
  25.     }
  26. }

Leider ohne Erfolg :/ Kommt immer null heraus...
__________________
Mein Blog
Freue mich über jeden Besucher. :)

Geändert von Nico B. (26-01-2010 um 15:33 Uhr)
Nico B. ist gerade online   Mit Zitat antworten
Alt 26-01-2010, 17:45   #4 (permalink)
Neuer User
 
Registriert seit: Oct 2008
Beiträge: 148
hi, du musst die daten wieder "manuell" erzeugen. das zb. serialisiert eine arraycollection mit einem variablen objekttypen...


Code:
private static function serializeConfigurations(valueObject:Class,collection:ArrayCollection):ArrayCollection{
			var xml:XML = describeType(new valueObject());
			var properties:XMLList = xml..variable.@name;
			var tempac:ArrayCollection = new ArrayCollection();
			
			for each( var object:Object in collection){
				var tempvo:Object = new valueObject();
				for each(var name:Object in properties){
					tempvo[name] = object[name];
				}
				tempac.addItem(tempvo);
			}
			return tempac;
		}
und

Code:
public static function getConfiguration():ArrayCollection{
			var byte:ByteArray = EncryptedLocalStore.getItem(KEY);
			var configurations:ArrayCollection = byte.readObject() as ArrayCollection;
			configurations = serializeConfigurations( ConfigurationVO, configurations);
	
			return configurations;
		}
direktes casten hat bei mir auch nie funktioniert...

Geändert von sytch (26-01-2010 um 17:48 Uhr)
sytch ist offline   Mit Zitat antworten
Alt 26-01-2010, 17:55   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Wie ich bereits schrieb, schaue dir mal registerClassAlias an
Code:
package fs.domain
{

  import flash.net.registerClassAlias;

  public class ValueObject
  {

    public var name:String; 

    public function ValueObject()
    {
      registerClassAlias("fs.domain.ValueObject", ValueObject);
    }

    public function toString():String
    {
      return "[object Woot, name:" + name + "]";
    }
  }
}
Code:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                                  xmlns:s="library://ns.adobe.com/flex/spark"
                                  xmlns:mx="library://ns.adobe.com/flex/halo"
                                  applicationComplete="onApplicationCompleteHandler(event)">
  <fx:Script>
    <![CDATA[
      import flash.utils.getQualifiedClassName;

      import fs.domain.ValueObject;

      import mx.events.FlexEvent;

      protected function onApplicationCompleteHandler(event:FlexEvent):void
      {
        var vo:ValueObject = new ValueObject();
        vo.name = "Fred";

        write("value", vo);
        var o:* = readAs("value", ValueObject);

        trace("toString             :", o);
        trace("getQualifiedClassName:", getQualifiedClassName(o));
      }

      private function readAs(key:String, type:Class):*
      {
        var bytes:ByteArray = EncryptedLocalStore.getItem(key);
        return bytes.readObject() as type;
      }  
  
      private function write(key:String, value:Object):void
      {
        var bytes:ByteArray = new ByteArray();
        bytes.writeObject(value);
        EncryptedLocalStore.setItem(key, bytes);
      }

    ]]>
  </fx:Script>
</s:WindowedApplication>
registerClassAlias kannst du prinzipiell auch zu Startup aufrufen.
Omega Psi ist offline   Mit Zitat antworten
Alt 26-01-2010, 17:56   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Zitat:
Zitat von sytch Beitrag anzeigen
direktes casten hat bei mir auch nie funktioniert...
Doch das geht, siehe oben.
Omega Psi ist offline   Mit Zitat antworten
Alt 26-01-2010, 17:59   #7 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Vergaß den Code:
Code:
protected function onApplicationCompleteHandler(event:FlexEvent):void
{
  var vo:ValueObject = new ValueObject();
  vo.name = "Fred";

  write("value", vo);
  var o:* = readAs("value");

  trace("toString :", o);
  trace("getQualifiedClassName:", getQualifiedClassName(o));
}

private function readAs(key:String):ValueObject
{
  var bytes:ByteArray = EncryptedLocalStore.getItem(key);
  return ValueObject(bytes.readObject());
}  
  
private function write(key:String, value:Object):void
{
  var bytes:ByteArray = new ByteArray();
  bytes.writeObject(value);
  EncryptedLocalStore.setItem(key, bytes);
}
Und bitte auch die Posts drüber lesen
Omega Psi ist offline   Mit Zitat antworten
Alt 26-01-2010, 18:25   #8 (permalink)
Neuer User
 
Registriert seit: Oct 2008
Beiträge: 148
na dann, wieder was gelernt...
sytch ist offline   Mit Zitat antworten
Alt 27-01-2010, 10:05   #9 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.407
Ola,

danke erstmal für den Code. (Funtzt alles soweit gut )


Ich stoße nur auf ein Problem:

Sobald ich die Applikation beende und wieder starte (und auf den Store zugreifen will) ist dieser Leer.

Ich frage mich jetzt, wieso das wohl so ist. Habe absolut keinen Ansatz, bisher hat das immer ohne Probleme geklappt.

Nutzen:
Würde gerne die X/Y Position der App speichern und a) keine lokale db/File anlegen und b) nocht 2 Werte (x,y) getrennt voneinander speichern.


Grüße Nico

Edit: Es scheint daran zu liegen, dass ich es nicht per writeUTFBytes hineinschreibe. Aber wie umgehe ich das am Besten?
__________________
Mein Blog
Freue mich über jeden Besucher. :)

Geändert von Nico B. (27-01-2010 um 11:03 Uhr)
Nico B. ist gerade online   Mit Zitat antworten
Alt 27-01-2010, 21:04   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Works like a charm
Code:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/halo"
                       applicationComplete="applicationCompleteHandler(event)">
  <fx:Script>
    <![CDATA[

      import flash.events.MouseEvent;
      import flash.utils.ByteArray;

      import fs.domain.Data;

      import mx.events.FlexEvent;

      //-----------------------------------------------------------------
      //
      //     Constants
      //
      //-----------------------------------------------------------------

      private const KEY:String = "key";

      //-----------------------------------------------------------------
      //
      //     Properties
      //
      //-----------------------------------------------------------------

      private var _data:Data;

      //-----------------------------------------------------------------
      //
      //     Methods
      //
      //-----------------------------------------------------------------
      
      private function read():Data
      {
        var bytes:ByteArray = EncryptedLocalStore.getItem(KEY);

        if (bytes)
        {
          return Data(bytes.readObject());
        }

        return new Data();
      }

      private function write(data:Data):void
      {
        var bytes:ByteArray = new ByteArray();
        bytes.writeObject(data);
        EncryptedLocalStore.setItem(KEY, bytes);
      }

      //-----------------------------------------------------------------
      //
      //     Event Handler
      //
      //-----------------------------------------------------------------

      protected function applicationCompleteHandler(event:FlexEvent):void
      {
        _data = read();
        input.text = _data.content;
      }

      protected function deleteButton_clickHandler(event:MouseEvent):void
      {
        EncryptedLocalStore.removeItem(KEY);
      }

      protected function saveButton_clickHandler(event:MouseEvent):void
      {
        _data.content = input.text;
        write(_data);
      }

    ]]>
  </fx:Script>

  <s:layout>
    <s:VerticalLayout horizontalAlign="center" />
  </s:layout>

  <s:HGroup height="24" verticalAlign="middle" width="100%">
    <s:Label id="dataLabel" text="data.content" />
    <s:TextInput id="input" />
    <s:Button id="saveButton" click="saveButton_clickHandler(event)" label="save" />
    <s:Button id="deleteButton" click="deleteButton_clickHandler(event)" label="delete" />
  </s:HGroup>  

</s:WindowedApplication>
Code:
package fs.domain
{

  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.events.IEventDispatcher;

  [RemoteClass("fs.domain.Data")]
  public class Data extends EventDispatcher
  {

    private var _content:String;

    [Bindable("contentChanged")]
    public function get content():String
    {
      return _content;
    }

    public function set content(value:String):void
    {
      if (!value)
      {
        value = "";
      }
      if (_content == value)
      {
        return;
      }
      _content = value;
      dispatchEvent(new Event("contentChanged"));
    }

    public function Data(target:IEventDispatcher=null)
    {
      super(target);
    }
  }
}
Omega Psi ist offline   Mit Zitat antworten
Alt 27-01-2010, 21:26   #11 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Et les sources...
Angehängte Dateien
Dateityp: zip Storage.fxp.zip (4,4 KB, 3x aufgerufen)
Omega Psi ist offline   Mit Zitat antworten
Alt 28-01-2010, 16:50   #12 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.407
Ola,

werd mir das mal über's WE alles reinziehen. Danke soweit (echt super von Dir)


Grüße, nico
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist gerade online   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
eigene Basisklasse für eigene Symbol-Klasse NinaH ActionScript 3 11 03-08-2009 23:22
eigene Eventlistener für einzelne Array Objekte? Steril707 ActionScript 3 2 27-11-2007 13:15
Eigene Objekte mit AS2 clonen hans jörg ActionScript 2 12 20-01-2007 11:40
LocalConnection - Eigene Objekte übergeben scalx69 Flash MX 2004 2 19-02-2006 21:47
Listener für eigene Objekte? MrHoga Flash MX 0 02-07-2002 04:19


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele