mgholam / fastJSON

Smallest, fastest polymorphic JSON serializer
https://www.codeproject.com/Articles/159450/fastJSON-Smallest-Fastest-Polymorphic-JSON-Seriali
MIT License
478 stars 148 forks source link

Cannot deserialize HashSet<> #129

Open jhughes2112 opened 3 years ago

jhughes2112 commented 3 years ago

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!

mgholam commented 3 years ago

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...

jhughes2112 commented 3 years ago

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?

mgholam commented 3 years ago

You can use RegisterCustomType().

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

jhughes2112 commented 3 years ago

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