.NET 7 预览版 5 已通过 Visual Studio 17.3 预览版 2 进行测试。如果您想将 .NET 7 与 Visual Studio 系列产品一起使用,我们建议您使用预览频道版本。 如果您使用的是 macOS,我们建议使用最新的 Visual Studio 2022 for Mac 预览版。 现在,让我们了解此版本中的一些最新更新。
可观察性
可观察性的目标是帮助您更好地了解应用程序在规模和技术复杂性增加时的状态。 ▌公开高效的 ActivityEvent 和 ActivityLink 标记枚举器方法 #68056
公开的方法可用于在性能关键场景中枚举 Tag 对象,而无需任何额外的分配和快速的项目访问。
var tags = new List<KeyValuePair<string, object?>>(){ new KeyValuePair<string, object?>("tag1", "value1"), new KeyValuePair<string, object?>("tag2", "value2"),};ActivityLink link = new ActivityLink(default, new ActivityTagsCollection(tags));foreach (ref readonly KeyValuePair<string, object?> tag in link.EnumerateTagObjects()){ // Consume the link tags without any extra allocations or value copying.} ActivityEvent e = new ActivityEvent("SomeEvent", tags: new ActivityTagsCollection(tags));foreach (ref readonly KeyValuePair<string, object?> tag in e.EnumerateTagObjects()){ // Consume the event's tags without any extra allocations or value copying.}
[JsonDerivedType(typeof(Derived))]public class Base{ public int X { get; set; }}public class Derived : Base{ public int Y { get; set; }}
复制代码
此配置为 Base 启用多态序列化,特别是在运行时类型为 Derived 时:
Base value = new Derived();JsonSerializer.Serialize<Base>(value); // { "X" : 0, "Y" : 0 }
复制代码
请注意,这不会启用多态反序列化,因为有效负载将作为 Base 往返:
Base value = JsonSerializer.Deserialize<Base>(@"{ ""X"" : 0, ""Y"" : 0 }");value is Derived; // false
复制代码
▌使用类型鉴别器
要启用多态反序列化,用户需要为派生类指定类型鉴别器:
[JsonDerivedType(typeof(Base), typeDiscriminator: "base")][JsonDerivedType(typeof(Derived), typeDiscriminator: "derived")]public class Base{ public int X { get; set; }}public class Derived : Base{ public int Y { get; set; }}
复制代码
现在将发出 JSON 以及类型鉴别器元数据:
Base value = new Derived();JsonSerializer.Serialize<Base>(value); // { "$type" : "derived", "X" : 0, "Y" : 0 }
复制代码
可用于多态反序列化值:
Base value = JsonSerializer.Deserialize<Base>(@"{ ""$type"" : ""derived"", ""X"" : 0, ""Y"" : 0 }");value is Derived; // true
复制代码
类型鉴别器标识符也可以是整数,因此以下形式是有效的:
[JsonDerivedType(typeof(Derived1), 0)][JsonDerivedType(typeof(Derived2), 1)][JsonDerivedType(typeof(Derived3), 2)]public class Base { }JsonSerializer.Serialize<Base>(new Derived2()); // { "$type" : 1, ... }
ReadOnlySpan<byte> source = stackalloc byte[0];if (!reader.HasReadOnlySequence && !reader.ValueIsEscaped){ source = reader.ValueSpan; // No need to copy to an intermediate buffer if value is span without escape sequences}else{ int valueLength = reader.HasReadOnlySequence ? checked((int)ValueSequence.Length) : ValueSpan.Length; Span<byte> buffer = valueLength <= 256 ? stackalloc byte[256] : new byte[valueLength]; int bytesRead = reader.CopyString(buffer); source = buffer.Slice(0, bytesRead);}ParseUnescapedBytes(source);
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco);
复制代码
全套 .NET 7 TFM,包括特定于操作的 TFM。
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco);
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco); -安卓
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco); -ios
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco); -maccatalyst
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco); -macos
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco); -tvos
[JsonSerializable(typeof(typeof(MyPoco))]public class MyContext : JsonSerializerContext {}public class MyPoco{ // Use of IAsyncEnumerable that previously resulted // in JsonSerializer.Serialize() throwing NotSupportedException public IAsyncEnumerable<int> Data { get; set; } }// It now works and no longer throws NotSupportedExceptionJsonSerializer.Serialize(new MyPoco { Data = ... }, MyContext.MyPoco); -windows