'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:
- veya'dan IEnumerable türetilir IAsyncEnumerable<T>
- Serileştirilebilir öğeler içerir.
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 IEnumerable
tü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:
Bu bir arabirim veya soyut değildir.
Parametresiz bir oluşturucuya sahiptir.
tarafından JsonSerializerdesteklenen öğe türlerini içerir.
Aşağıdaki arabirimlerden veya sınıflardan birini veya daha fazlasını uygular veya devralır:
- ConcurrentQueue<T>
- ConcurrentStack<T> *
- ICollection<T>
- IDictionary
- IDictionary<TKey,TValue> †
- IList
- IList<T>
- Queue
- Queue<T>
- Stack *
- Stack<T> *
* Bkz. Türler için
Stack
destek gidiş dönüş.† Bkz. Desteklenen anahtar türleri.
Bilinen sorunlarla özel koleksiyonlar
Aşağıdaki özel koleksiyonlarla ilgili bilinen sorunlar vardır:
- ExpandoObject: Bkz . dotnet/runtime#29690.
- DynamicObject: Bkz . dotnet/runtime#1808.
- DataTable: Bkz . dotnet/docs#21366.
- Microsoft.AspNetCore.Http.FormFile: Bkz . dotnet/runtime#1559.
- Microsoft.AspNetCore.Http.IFormCollection: Bkz . dotnet/runtime#1559.
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.