Aracılığıyla paylaş


'da desteklenen koleksiyon türleri System.Text.Json

Bu makalede, serileştirme ve seri durumdan çıkarma için hangi koleksiyonların desteklendiğine genel bir bakış sunulmaktadır. System.Text.Json.JsonSerializer serileştirme için bir koleksiyon türünü destekler:

Seri hale getirici yöntemini çağırır GetEnumerator() ve öğeleri yazar.

Seri durumdan çıkarma daha karmaşıktır ve bazı koleksiyon türleri için desteklenmez.

Aşağıdaki bölümler ad alanına göre düzenlenir ve serileştirme ve seri durumdan çıkarma için hangi türlerin desteklendiği gösterilir.

System.Array ad alanı

Tür Serileştirme Deserialization
Tek boyutlu diziler ✔️ ✔️
Çok boyutlu diziler
Pürüzlü diziler ✔️ ✔️

System.Collections ad alanı

Tür Serileştirme Deserialization
ArrayList ✔️ ✔️
BitArray ✔️
DictionaryEntry ✔️ ✔️
Hashtable ✔️ ✔️
ICollection ✔️ ✔️
IDictionary ✔️ ✔️
IEnumerable ✔️ ✔️
IList ✔️ ✔️
Queue ✔️ ✔️
SortedList ✔️ ✔️
Stack * ✔️ ✔️

* Bkz. Türler için Stack destek gidiş dönüş.

System.Collections.Generic ad alanı

Tür Serileştirme Deserialization
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> ✔️ ✔️

* Bkz . Desteklenen anahtar türleri.

† üzerinde aşağıdaki bölüme IAsyncEnumerable<T>bakın.

‡ Bkz. Türler için Stack gidiş dönüş desteği.

IAsyncEnumerable<T>

Aşağıdaki örneklerde akışlar, zaman uyumsuz veri kaynaklarının bir gösterimi olarak kullanılır. Kaynak, yerel makinedeki dosyalar veya veritabanı sorgusu veya web hizmeti API çağrısının sonuçları olabilir.

Akış serileştirme

System.Text.Json , aşağıdaki örnekte gösterildiği gibi değerleri JSON dizileri olarak serileştirmeyi IAsyncEnumerable<T> destekler:

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> değerleri yalnızca gibi JsonSerializer.SerializeAsynczaman uyumsuz serileştirme yöntemleri tarafından desteklenir.

Akış seri durumdan çıkarma

DeserializeAsyncEnumerable yöntemi, aşağıdaki örnekte gösterildiği gibi akış seri durumdan çıkarma işlemini destekler:

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

DeserializeAsyncEnumerable yöntemi yalnızca kök düzeyindeki JSON dizilerinden okumayı destekler.

DeserializeAsync yöntemi desteklerIAsyncEnumerable<T>, ancak imzası akışa izin vermez. Aşağıdaki örnekte gösterildiği gibi son sonucu tek bir değer olarak döndürür.

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

Bu örnekte seri durumdan çıkarıcı, seri durumdan çıkarılmış nesneyi döndürmeden önce bellekteki tüm IAsyncEnumerable<T> içeriği arabelleğe alır. Seri durumdan çıkarıcının bir sonuç döndürmeden önce JSON yükünün tamamını okuması gerektiğinden bu davranış gereklidir.

System.Collections.Immutable ad alanı

Tür Serileştirme Deserialization
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> * ✔️ ✔️

* Bkz. Türler için Stack destek gidiş dönüş.

† Bkz. Desteklenen anahtar türleri.

System.Collections.Specialized ad alanı

Tür Serileştirme Deserialization
BitVector32 ✔️ ❌*
HybridDictionary ✔️ ✔️
IOrderedDictionary ✔️
ListDictionary ✔️ ✔️
NameValueCollection ✔️
StringCollection ✔️
StringDictionary ✔️

* Seri durumdan çıkarıldığında BitVector32 özelliği Data genel ayarlayıcıya sahip olmadığından atlanır. Özel durum oluşturulmaz.

System.Collections.Concurrent ad alanı

Tür Serileştirme Deserialization
BlockingCollection<T> ✔️
ConcurrentBag<T> ✔️
ConcurrentDictionary<TKey,TValue> ✔️ ✔️
ConcurrentQueue<T> ✔️ ✔️
ConcurrentStack<T> * ✔️ ✔️

* Bkz. Türler için Stack destek gidiş dönüş.

† Bkz. Desteklenen anahtar türleri.

System.Collections.ObjectModel ad alanı

Tür Serileştirme Deserialization
Collection<T> ✔️ ✔️
KeyedCollection<dizesi, TValue> * ✔️
ObservableCollection<T> ✔️ ✔️
ReadOnlyCollection<T> ✔️
ReadOnlyDictionary<TKey,TValue> ✔️
ReadOnlyObservableCollection<T> ✔️

* Olmayanstring anahtarlar desteklenmez.

Özel koleksiyonlar

Önceki ad alanlarının birinde olmayan herhangi bir koleksiyon türü özel koleksiyon olarak kabul edilir. Bu tür türler, ASP.NET Core tarafından tanımlanan kullanıcı tanımlı türleri ve türleri içerir. Örneğin, Microsoft.Extensions.Primitives bu gruptadır.

Tüm özel koleksiyonlar (öğesinden IEnumerabletüretilen her şey), öğe türleri desteklendiği sürece serileştirme için desteklenir.

Seri durumdan çıkarma desteğine sahip özel koleksiyonlar

Özel koleksiyon, seri durumdan çıkarma için şu durumda desteklenir:

Bilinen sorunlarla özel koleksiyonlar

Aşağıdaki özel koleksiyonlarla ilgili bilinen sorunlar vardır:

Bilinen sorunlar hakkında daha fazla bilgi için içindeki açık sorunlara System.Text.Jsonbakın.

Desteklenen anahtar türleri

ve SortedList türleri için Dictionary desteklenen türler şunlardır:

  • Boolean
  • Byte
  • DateTime
  • DateTimeOffset
  • Decimal
  • Double
  • Enum
  • Guid
  • Int16
  • Int32
  • Int64
  • Object (Yalnızca serileştirmede ve çalışma zamanı türü bu listedeki desteklenen türlerden biriyse.)
  • SByte
  • Single
  • String
  • UInt16
  • UInt32
  • UInt64

System.Data ad alanı

Ad alanında , DataTableve ilgili türler System.Data için DataSetyerleşik dönüştürücü yoktur. Güvenlik kılavuzunda açıklandığı gibi, bu türleri güvenilmeyen girişten seri durumdan çıkarma güvenli değildir. Ancak, bu türleri desteklemek için özel bir dönüştürücü yazabilirsiniz. bir seri hale getiren ve seri durumdan çıkaran DataTableörnek özel dönüştürücü kodu için bkz . RoundtripDataTable.cs.

Ayrıca bkz.