Megosztás a következőn keresztül:


Támogatott gyűjteménytípusok a következő helyen: System.Text.Json

Ez a cikk áttekintést nyújt a szerializálás és a deszerializálás által támogatott gyűjteményekről. System.Text.Json.JsonSerializer a szerializáláshoz támogatja a gyűjteménytípust, ha:

A szerializáló meghívja a metódust GetEnumerator() , és megírja az elemeket.

A deszerializálás bonyolultabb, és egyes gyűjteménytípusok esetében nem támogatott.

A következő szakaszok névtér szerint vannak rendszerezve, és megjelenítik, hogy mely típusokat támogatja a szerializálás és a deszerializálás.

System.Array névtér

Típus Szerializációs Deszerializálás
Egydimenziós tömbök ✔️ ✔️
Többdimenziós tömbök
Szaggatott tömbök ✔️ ✔️

System.Collections névtér

Típus Szerializációs Deszerializálás
ArrayList ✔️ ✔️
BitArray ✔️
DictionaryEntry ✔️ ✔️
Hashtable ✔️ ✔️
ICollection ✔️ ✔️
IDictionary ✔️ ✔️
IEnumerable ✔️ ✔️
IList ✔️ ✔️
Queue ✔️ ✔️
SortedList ✔️ ✔️
Stack * ✔️ ✔️

* A típusokkal kapcsolatban lásd a Támogatási körút című témakörtStack.

System.Collections.Generic névtér

Típus Szerializációs Deszerializálás
Dictionary<TKey,TValue> * ✔️ ✔️
HashSet<T> ✔️ ✔️
IAsyncEnumerable<T> ✔️ ✔️
ICollection<T> ✔️ ✔️
IDictionary<TKey,TValue> * ✔️ ✔️
IEnumerable<T> ✔️ ✔️
IList<T> ✔️ ✔️
IReadOnlyCollection<T> ✔️ ✔️
IReadOnlyDictionary<TKey,TValue> * ✔️ ✔️
IReadOnlyList<T> ✔️ ✔️
ISet<T> ✔️ ✔️
KeyValuePair<TKey,TValue> ✔️ ✔️
LinkedList<T> ✔️ ✔️
LinkedListNode<T> ✔️
List<T> ✔️ ✔️
Queue<T> ✔️ ✔️
SortedDictionary<TKey,TValue> * ✔️ ✔️
SortedList<TKey,TValue> * ✔️ ✔️
SortedSet<T> ✔️ ✔️
Stack<T> ✔️ ✔️

* Lásd a támogatott kulcstípusokat.

† Lásd a következő szakaszt.IAsyncEnumerable<T>

‡ A típusokkal kapcsolatban lásd a támogatási körutazástStack.

IAsyncEnumerable<T>

Az alábbi példák streameket használnak az aszinkron adatforrások ábrázolásaként. A forrás lehet fájl egy helyi gépen, vagy egy adatbázis-lekérdezés vagy egy webszolgáltatás API-hívásának eredménye.

Stream szerializálása

System.Text.Json támogatja az értékek JSON-tömbökként való szerializálását IAsyncEnumerable<T> , ahogyan az az alábbi példában is látható:

using System.Text.Json;

namespace IAsyncEnumerableSerialize;

public class Program
{
    public static async Task Main()
    {
        using Stream stream = Console.OpenStandardOutput();
        var data = new { Data = PrintNumbers(3) };
        await JsonSerializer.SerializeAsync(stream, data);
    }

    static async IAsyncEnumerable<int> PrintNumbers(int n)
    {
        for (int i = 0; i < n; i++)
        {
            await Task.Delay(1000);
            yield return i;
        }
    }
}
// output:
//  {"Data":[0,1,2]}

IAsyncEnumerable<T> az értékeket csak az aszinkron szerializálási módszerek támogatják, például JsonSerializer.SerializeAsync.

Stream deszerializálása

A DeserializeAsyncEnumerable módszer támogatja a streamelt deszerializálást, ahogy az az alábbi példában is látható:

using System.Text;
using System.Text.Json;

namespace IAsyncEnumerableDeserialize;

public class Program
{
    public static async Task Main()
    {
        using var stream = new MemoryStream(Encoding.UTF8.GetBytes("[0,1,2,3,4]"));
        await foreach (int item in JsonSerializer.DeserializeAsyncEnumerable<int>(stream))
        {
            Console.WriteLine(item);
        }
    }
}
// output:
//0
//1
//2
//3
//4

A DeserializeAsyncEnumerable metódus csak a gyökérszintű JSON-tömbökből való olvasást támogatja.

A DeserializeAsync metódus támogatja IAsyncEnumerable<T>, de aláírása nem teszi lehetővé a streamelést. A végeredményt egyetlen értékként adja vissza, ahogy az az alábbi példában is látható.

using System.Text;
using System.Text.Json;

namespace IAsyncEnumerableDeserializeNonStreaming;

public class MyPoco
{
    public IAsyncEnumerable<int>? Data { get; set; }
}

public class Program
{
    public static async Task Main()
    {
        using var stream = new MemoryStream(Encoding.UTF8.GetBytes(@"{""Data"":[0,1,2,3,4]}"));
        MyPoco? result = await JsonSerializer.DeserializeAsync<MyPoco>(stream)!;
        await foreach (int item in result!.Data!)
        {
            Console.WriteLine(item);
        }
    }
}
// output:
//0
//1
//2
//3
//4

Ebben a példában a deszerializáló puffereli a memóriában lévő összes IAsyncEnumerable<T> tartalmat, mielőtt visszaadja a deszerializált objektumot. Ez a viselkedés azért szükséges, mert a deszerializálónak az eredmény visszaadása előtt be kell olvasnia a teljes JSON hasznos adatot.

System.Collections.Nem módosítható névtér

Típus Szerializációs Deszerializálás
IImmutableDictionary<TKey,TValue> ✔️ ✔️
IImmutableList<T> ✔️ ✔️
IImmutableQueue<T> ✔️ ✔️
IImmutableSet<T> ✔️ ✔️
IImmutableStack<T> * ✔️ ✔️
ImmutableArray<T> ✔️ ✔️
ImmutableDictionary<TKey,TValue> ✔️ ✔️
ImmutableHashSet<T> ✔️ ✔️
ImmutableQueue<T> ✔️ ✔️
ImmutableSortedDictionary<TKey,TValue> ✔️ ✔️
ImmutableSortedSet<T> ✔️ ✔️
ImmutableStack<T> * ✔️ ✔️

* A típusokkal kapcsolatban lásd a Támogatási körút című témakörtStack.

† Lásd a támogatott kulcstípusokat.

System.Collections.Specializált névtér

Típus Szerializációs Deszerializálás
BitVector32 ✔️ ❌*
HybridDictionary ✔️ ✔️
IOrderedDictionary ✔️
ListDictionary ✔️ ✔️
NameValueCollection ✔️
StringCollection ✔️
StringDictionary ✔️

* Ha BitVector32 deszerializálódik, a Data tulajdonság kimarad, mert nincs nyilvános beállítója. Nem képződik kivétel.

System.Collections.Concurrent névtér

Típus Szerializációs Deszerializálás
BlockingCollection<T> ✔️
ConcurrentBag<T> ✔️
ConcurrentDictionary<TKey,TValue> ✔️ ✔️
ConcurrentQueue<T> ✔️ ✔️
ConcurrentStack<T> * ✔️ ✔️

* A típusokkal kapcsolatban lásd a Támogatási körút című témakörtStack.

† Lásd a támogatott kulcstípusokat.

System.Collections.ObjectModel névtér

Típus Szerializációs Deszerializálás
Collection<T> ✔️ ✔️
KeyedCollection sztring<, TValue> * ✔️
ObservableCollection<T> ✔️ ✔️
ReadOnlyCollection<T> ✔️
ReadOnlyDictionary<TKey,TValue> ✔️
ReadOnlyObservableCollection<T> ✔️

* A nem kulcsokstring nem támogatottak.

Egyéni gyűjtemények

Minden olyan gyűjteménytípus, amely nem szerepel az előző névterek egyikében, egyéni gyűjteménynek minősül. Az ilyen típusok közé tartoznak a ASP.NET Core által definiált, felhasználó által definiált típusok. Például Microsoft.Extensions.Primitives ebben a csoportban van.

Minden egyéni gyűjtemény (minden, amelyből IEnumerableszármazik) támogatott a szerializálás, mindaddig, amíg az elemtípusok támogatottak.

Egyéni gyűjtemények deszerializálási támogatással

Az egyéni gyűjtemények akkor támogatottak a deszerializáláshoz, ha:

Ismert problémákkal rendelkező egyéni gyűjtemények

Az alábbi egyéni gyűjteményekkel kapcsolatban ismert problémák lépnek fel:

Az ismert problémákról további információt a nyitott problémákat ismertető cikkben System.Text.Jsontalál.

Támogatott kulcstípusok

A kulcsok Dictionary és SortedList típusok támogatott típusai a következők:

  • Boolean
  • Byte
  • DateTime
  • DateTimeOffset
  • Decimal
  • Double
  • Enum
  • Guid
  • Int16
  • Int32
  • Int64
  • Object (Csak szerializáláskor, és ha a futtatókörnyezet típusa a lista egyik támogatott típusa.)
  • SByte
  • Single
  • String
  • UInt16
  • UInt32
  • UInt64

System.Data névtér

A névtérben nincsenek beépített konverterek a , DataTableés a System.Data kapcsolódó típusok számáraDataSet. Az ilyen típusú adatok nem megbízható bemenetektől való deszerializálása nem biztonságos, ahogyan azt a biztonsági útmutató ismerteti. Azonban egyéni konvertert is írhat, hogy támogassa ezeket a típusokat. A szerializálni és deszerializálni DataTablekívánt egyéni átalakítókód mintáját lásd: RoundtripDataTable.cs.

Kapcsolódó információk