fastJSON icon indicating copy to clipboard operation
fastJSON copied to clipboard

Cannot deserialize HashSet<>

Open jhughes2112 opened this issue 4 years ago • 4 comments

I have a class that contains a HashSet in it. The output looks perfect and contains the string entries as expected. Deserializing that file back into a class fails with an invalid cast, approximately here in JSON.cs (776):

                                    if (pi.IsGenericType && pi.IsValueType == false && v is List<object>)
                                        oset = CreateGenericList((List<object>)v, pi.pt, pi.bt, globaltypes);

No specific type seems to be stored in the $types array. Here's an example, where bseos is a HashSet:

{
   "$types" : {
      "MockServer.SerializedAccount, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" : "1"
   },
   "$type" : "1",
   "username" : "jhughes2112",
   "bseos" : [
      "bee79025-5908-4235-9095-c0da046fb461",
      "377c212a-60dc-4b52-8e91-32fa1a8bb4c2"
   ]
}

I can convert this to a List for serialization purposes in my case, but it would be worth supporting the correct generic collection.

Thanks!

jhughes2112 avatar Jun 07 '21 23:06 jhughes2112

You know I have never used a HashSet !!

I believe you can swap it with a List for data transfer objects, and it seems only good for set operations...

mgholam avatar Jun 08 '21 09:06 mgholam

HashSet is basically just the keys part of the Dictionary type. Very fast lookups and strongly typed, but also has set operations. It's good!

In my case List works fine. Out of curiosity, is there a way to extend fastJSON with new types easily?

jhughes2112 avatar Jun 08 '21 15:06 jhughes2112

You can use RegisterCustomType().

If HashSet implemented IList all would be good, so I will have to find another way...

mgholam avatar Jun 08 '21 15:06 mgholam

Seems like anything derived from IEnumerable<T> could be handled generically, which would take care of most or all of the Collections.Generic types.

jhughes2112 avatar Jun 08 '21 16:06 jhughes2112