So according to your explanation if i do something like (is B) or (is C), those classes will be included into my SWF????
I am no longer at the office but tomorrow that will be the first thing i will try. I have used the C object in other modules of the application so i am not really positive that it will work but it is worth the try. --- In flexcoders@yahoogroups.com, "Josh McDonald" <[EMAIL PROTECTED]> wrote: > > Then the problem is with your definition of C, and it's being unmarshalled > incorrectly. That's basically what I was trying to say, but I think I > explained it poorly. > > When you make no explicit reference to the class C it is never included in > your SWF, so the remoting system never sees the [RemoteObject] annotation, > and hence the unmarshaller simply creates an Object (instead of a C). When > you're referencing B with the expression "(is B)" the compiler includes B in > your swf, and then it encounters a reference to C inside B, so it includes > that as well. When you fetch your object, the unmarshaller sees that "myC" > should be a C, so it instantiates a new C and then tries to populate it. > Somehow the strongly-typed population of C is failing, so you get the > default values. But when you never reference B, the compiler never sees C, > so the unmarshaller never knows about it and just creates an Object (or more > likely an ObjectProxy) for the "myC" field. Also note that in this case your > objects you expect to be instances of B will also actually be ObjectProxy > instances. Do a little single-step debugging and some > trace(getQualifiedClassName(someInstance)) to see what's really going on > inside your SWF at runtime to see if what I'm saying is what's actually > happening. > > But it looks to me if you're only interested in fixing the problem (not > everybody wants to know as much detail as I do I've learned over the years), > go over your Flex and Java definitions of C with a fine-tooth comb and make > sure they match! > > -Josh > > On Tue, Sep 9, 2008 at 10:16 AM, dmiramontesval <[EMAIL PROTECTED] > > wrote: > > > I don't think that is what's happening, when i use "if (i is B)" the > > condition does work, it enters the if block but it resets the C object. > > > > I tried a new thing, on B i changed the myC declaration > > > > public var myC:Object; // Object instead of C > > > > By doing this i can use if (i is B) and now it doesn't reset the > > values of myC, but the problem is that if i try the following: > > > > if (i.myC is C) > > > > this gives me false :( > > > > > > Any ideas? > > > > > > --- In flexcoders@yahoogroups.com, "Josh McDonald" <dznuts@> wrote: > > > > > > Sounds to me like you're accidentally declaring b.myC as a static, > > perhaps. > > > > > > Actually, double check your examples (perhaps using the link report > > option > > > on MXMLC). It might be that you're not actually referencing B and > > it's not > > > becoming part of your SWF, in which case you're getting a "best guess" > > > object where you think you're getting an instance of B (you can't > > check for > > > "is B" without including it in your swf, but you can check for "!(is A)" > > > without including the B class. > > > > > > In which case, it's the unmarshaller that's killing your data when > > trying to > > > convert it to a B (becuase now it knows to do it, once you've > > referenced the > > > class and it's in your SWF). Double check how you're defining C in > > your Flex > > > *and in your Java*. > > > > > > Also, if it's the unmarshaller that's the problem, I'd definitely try a > > > compile against Flex 3.01 and see if the problem goes away. If > > you've got a > > > smallest-failiing case project for this bug it should only take you > > a few > > > minutes. > > > > > > -Josh > > > > > > On Tue, Sep 9, 2008 at 9:53 AM, dmiramontesval > > > <dmiramontesval@>wrote: > > > > > > > Ummmmm actually my example is wrong, i was missing something, let me > > > > explain again: > > > > > > > > I have 3 classes as a matter of fact, classes A and B are correct but > > > > i forgot to mention that inside B there is an object C: > > > > > > > > [RemoteClass(alias="com.test.B")] > > > > public class B { > > > > public var id:Number; > > > > public var name:String; > > > > public var myC:C > > > > } > > > > > > > > [RemoteClass(alias="com.test.C")] > > > > public class C { > > > > public var testVar1:Number; > > > > public var testVar2:String; > > > > } > > > > > > > > > > > > A objectA = new A(); > > > > objectA.myMap = new HashMap(); > > > > B objectB1 = new B(); > > > > C objectC1 = new C(); > > > > objectB1.id = 1; > > > > objectB1.name = "Test"; > > > > objectC1.testVar1 = 2; > > > > objectC1.testVar2 = "Hello"; > > > > objectB1.myC = objectC1; > > > > myMap.put("key1", objectB1); > > > > > > > > > > > > Now here is the deal, the only property being reset is the C object, > > > > the id and name properties are not reset > > > > > > > > > > > > for each(var i:* in objectA.myMap) { > > > > if (i is B) { > > > > trace(i.id + " " + i.name); > > > > trace(i.myC.testVar1 + " " + i.myC.testVar2); > > > > } > > > > } > > > > > > > > The first trace works fine, but the second trace shows NaN and empty > > > > string. > > > > If i change the code to: > > > > > > > > for each(var i:* in objectA.myMap) { > > > > if (!(i is A)) { > > > > trace(i.id + " " + i.name); > > > > trace(i.myC.testVar1 + " " + i.myC.testVar2); > > > > } > > > > } > > > > > > > > Both traces work fine, prints 1 Test and 2 Hello. > > > > > > > > Like you said i have some logic inside the B constructor: > > > > > > > > public function B() { > > > > myC = new C(); > > > > } > > > > > > > > I commented the constructor and instead of getting the values reset i > > > > got an error saying i tried to access a null reference, since C is > > > > null (if i don't use an instance of B then it works fine). > > > > > > > > So i am kinda back where i started, when i use the B class the C > > > > object inside each B object is reset. > > > > > > > > > > > > --- In flexcoders@yahoogroups.com, "Josh McDonald" <dznuts@> wrote: > > > > > > > > > > Right, I see. I suppose you may be doing something funky in the > > > > constructor > > > > > for your actual impl of A or B. Try commenting out the constructor > > > > and see > > > > > if you have the same problem. > > > > > > > > > > -Josh > > > > > > > > > > On Tue, Sep 9, 2008 at 9:17 AM, dmiramontesval > > > > > <dmiramontesval@>wrote: > > > > > > > > > > > They keys in the Java map are Strings and the values are B > > objects, > > > > > > you could say it is HashMap<String, B>. > > > > > > So suppose in Java i do this: > > > > > > > > > > > > A objectA = new A(); > > > > > > objectA.myMap = new HashMap(); > > > > > > B objectB1 = new B(); > > > > > > objectB1.id = 1; > > > > > > objectB1.name = "Test"; > > > > > > myMap.put("key1", objectB1); > > > > > > > > > > > > In Flex if i iterate over the myMap property: > > > > > > > > > > > > for each(var i:* in objectA.myMap) { > > > > > > if (i is B) { > > > > > > trace(i.id + " " + i.name); > > > > > > } > > > > > > } > > > > > > > > > > > > Doing this resets the B object inside myMap, so the trace > > prints NaN > > > > > > and empty string. > > > > > > > > > > > > If i dont use an instance of B: > > > > > > > > > > > > for each(var i:* in objectA.myMap) { > > > > > > if (!(i is A)) { > > > > > > trace(i.id + " " + i.name); > > > > > > } > > > > > > } > > > > > > > > > > > > The trace prints 1 Test. > > > > > > > > > > > > The main issue is that if i create an instance of B anywhere in my > > > > > > code, the B object inside myMap resets. > > > > > > > > > > > > The second issue is that inside the myMap property there are two > > > > > > objects instead of just one, this additional object is a > > reference to > > > > > > A and its key is "owner", so the myMap property looks like: > > > > > > > > > > > > var myMap:Object = {owner:the A object, key1: the B object}; > > > > > > > > > > > > > > > > > > I have no idea where this reference to the A object comes > > from, but i > > > > > > can live with that, the main issue is that i can't use the B class > > > > > > because if i do the B objects inside the map are reset. > > > > > > > > > > > > > > > > > > --- In flexcoders@yahoogroups.com, "Josh McDonald" <dznuts@> > > wrote: > > > > > > > > > > > > > > The problem I think is you're using the wrong data structures. > > > > > > > > > > > > > > If your Java map looks like this: > > > > > > > > > > > > > > HashMap<int, String> myMap; > > > > > > > > > > > > > > What you'll get in Flex isn't what you've got below, it's an > > > > object like > > > > > > > this: > > > > > > > > > > > > > > var mymap : Object = > > > > > > > { > > > > > > > 1: "String 1", > > > > > > > 2: "String 2", > > > > > > > 79: "Blue" > > > > > > > } > > > > > > > > > > > > > > Not the structure that you're trying to coerce it to based > > on the > > > > > > code you > > > > > > > posted. But since this is clearly just "example" Flex code and I > > > > have no > > > > > > > idea about what your Java looks like, I'm just guessing. > > > > > > > > > > > > > > -Josh > > > > > > > > > > > > > > On Tue, Sep 9, 2008 at 8:46 AM, dmiramontesval > > > > > > > <dmiramontesval@>wrote: > > > > > > > > > > > > > > > I have this weird issue and i can't figure it out, let me > > explain: > > > > > > > > > > > > > > > > I have a java object A which has a HashMap variable myMap, > > > > this map > > > > > > > > will hold objects of class B. In ActionScript i have the > > > > corresponding > > > > > > > > class A which has a variable myMap but since there is no > > > > HashMap in > > > > > > > > ActionScript its type is Object and i also have the > > corresponding > > > > > > class B. > > > > > > > > > > > > > > > > [RemoteClass(alias="com.test.A")] > > > > > > > > public class A { > > > > > > > > public var myMap:Object; // this is the HashMap in Java > > > > > > > > } > > > > > > > > > > > > > > > > [RemoteClass(alias="com.test.B")] > > > > > > > > public class B { > > > > > > > > public var id:Number; > > > > > > > > public var name:String; > > > > > > > > } > > > > > > > > > > > > > > > > I need to put the objects B contained in the map inside a > > > > DataGrid so > > > > > > > > i am obtaining the object of class A using a RemoteObject and > > > > then i > > > > > > > > iterate over the myMap property using a for each in loop, like > > > > this: > > > > > > > > > > > > > > > > for each(var i:* in objectA.myMap) { > > > > > > > > someArrayCollection.add(i); > > > > > > > > } > > > > > > > > > > > > > > > > The first issue appears here, suppose the java HashMap > > contains 3 > > > > > > > > elements, in the ActionScript loop i get 4 elements, the > > > > fourth one > > > > > > > > being a reference to the A object (its key appears as > > "owner"). In > > > > > > > > order to avoid this i use the "is" operator like this: > > > > > > > > > > > > > > > > for each(var i:* in objectA.myMap) { > > > > > > > > if (i is B) { > > > > > > > > someArrayCollection.add(i); > > > > > > > > } > > > > > > > > } > > > > > > > > > > > > > > > > Now here is the real issue, when i do this the B objects > > > > contained in > > > > > > > > the myMap property are reset to their initial values (NaN and > > > > empty > > > > > > > > string according to the B class). I changed the if condition > > > > to this > > > > > > > > and worked: > > > > > > > > > > > > > > > > for each(var i:* in objectA.myMap) { > > > > > > > > if (!(i is A)) { > > > > > > > > someArrayCollection.add(i); > > > > > > > > } > > > > > > > > } > > > > > > > > When i did this the DataGrid shows the elements in the > > > > > > > > someArrayCollection perfectly fine. I did a little more > > > > testing and i > > > > > > > > "figured" out the issue, if i use an instance of class B > > > > anywhere in > > > > > > > > my application, the values of the B objects inside the myMap > > > > property > > > > > > > > are reset, for example: > > > > > > > > > > > > > > > > for each(var i:* in objectA.myMap) { > > > > > > > > if (i is B) { > > > > > > > > someArrayCollection.add(i); > > > > > > > > } > > > > > > > > } > > > > > > > > var test:B = new B(); > > > > > > > > > > > > > > > > This resets the B objects inside the myMap property of the A > > > > object > > > > > > > > which makes no absolute sense, this is why when i used the B > > > > class in > > > > > > > > the if condition the objects reset their values. > > > > > > > > > > > > > > > > So the thing is whenever i use the B class, which is the class > > > > of the > > > > > > > > objects inside myMap, the B objects are reset!!!! Does anyone > > > > know how > > > > > > > > to fix this????? > > > > > > > > > > > > > > > > I am using Flex 2.01 hotfix 3, i wonder if this is some kind > > > > of bug > > > > > > > > that was solved in a later release. > > > > > > > > > > > > > > > > Any help would be appreciated. > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------ > > > > > > > > > > > > > > > > -- > > > > > > > > Flexcoders Mailing List > > > > > > > > FAQ: > > > > http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt > > > > > > > > Search Archives: > > > > > > > > http://www.mail-archive.com/flexcoders%40yahoogroups.comYahoo! > > > > Groups > > > > > > > > Links > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > "Therefore, send not to know For whom the bell tolls. It > > tolls for > > > > > > thee." > > > > > > > > > > > > > > http://flex.joshmcdonald.info/ > > > > > > > > > > > > > > :: Josh 'G-Funk' McDonald > > > > > > > :: 0437 221 380 :: josh@ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------ > > > > > > > > > > > > -- > > > > > > Flexcoders Mailing List > > > > > > FAQ: > > http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt > > > > > > Search Archives: > > > > > > http://www.mail-archive.com/flexcoders%40yahoogroups.comYahoo! > > Groups > > > > > > Links > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > "Therefore, send not to know For whom the bell tolls. It tolls for > > > > thee." > > > > > > > > > > http://flex.joshmcdonald.info/ > > > > > > > > > > :: Josh 'G-Funk' McDonald > > > > > :: 0437 221 380 :: josh@ > > > > > > > > > > > > > > > > > > > > > ------------------------------------ > > > > > > > > -- > > > > Flexcoders Mailing List > > > > FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt > > > > Search Archives: > > > > http://www.mail-archive.com/flexcoders%40yahoogroups.comYahoo! Groups > > > > Links > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > "Therefore, send not to know For whom the bell tolls. It tolls for > > thee." > > > > > > http://flex.joshmcdonald.info/ > > > > > > :: Josh 'G-Funk' McDonald > > > :: 0437 221 380 :: josh@ > > > > > > > > > > > ------------------------------------ > > > > -- > > Flexcoders Mailing List > > FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt > > Search Archives: > > http://www.mail-archive.com/flexcoders%40yahoogroups.comYahoo! Groups > > Links > > > > > > > > > > > -- > "Therefore, send not to know For whom the bell tolls. It tolls for thee." > > http://flex.joshmcdonald.info/ > > :: Josh 'G-Funk' McDonald > :: 0437 221 380 :: [EMAIL PROTECTED] >