Hướng dẫn javascriptserializer unity - javascriptserializer thống nhất

Lỗi tuần tự hóa kịch bản

Sử dụng lớp jsonutility để chuyển đổi các đối tượng Unity sang và từ định dạng JSON. Ví dụ: bạn có thể sử dụng tuần tự hóa JSON để tương tác với các dịch vụ web hoặc để dễ dàng đóng gói và giải nén dữ liệu lên định dạng dựa trên văn bản.

Sê -ri JSON sử dụng một khái niệm về cấu trúc của JSON JSON: Bạn tạo một lớp hoặc cấu trúc để mô tả những biến nào bạn muốn lưu trữ trong dữ liệu JSON của mình. Ví dụ:

[Serializable]
public class MyClass
{
    public int level;
    public float timeElapsed;
    public string playerName;
}

Điều này xác định một lớp C# đơn giản chứa ba biến [cấp độ, thời gian và playername] và đánh dấu nó bằng thuộc tính Serializable, để làm việc với trình tự kiểm tra JSON. Để tạo một thể hiện của lớp của bạn, bạn có thể sử dụng một cái gì đó như thế này:level, timeElapsed, and playerName] and marks it with the Serializable attribute, in order to work with the JSON serializer. To create an instance of your class, you can use something like this:

MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";

Sau đó sử dụng phương thức jsonUtility.tojson để tuần tự hóa nó [chuyển đổi nó] sang định dạng JSON:

string json = JsonUtility.ToJson[myObject];
// json now contains: '{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}'

Để chuyển đổi JSON trở lại thành một đối tượng, hãy sử dụng jsonutility.fromjson:

myObject = JsonUtility.FromJson[json];

Điều này tạo ra một thể hiện mới của MyClass và đặt các giá trị trên nó bằng dữ liệu JSON. Nếu dữ liệu JSON chứa các giá trị không ánh xạ tới các trường trong MyClass, thì bộ tuần tự sẽ bỏ qua các giá trị đó. Nếu dữ liệu JSON bị thiếu các giá trị cho các trường trong MyClass, thì bộ tuần tự sẽ để lại các giá trị được xây dựng cho các trường đó trong đối tượng được trả về.

Ghi đè các đối tượng với JSON

Bạn cũng có thể giảm bớt dữ liệu JSON trên một đối tượng hiện có, ghi đè bất kỳ dữ liệu hiện có nào:

JsonUtility.FromJsonOverwrite[json, myObject];

Nếu dữ liệu JSON không chứa giá trị cho một trường, bộ tuần tự không thay đổi giá trị trường đó. Phương pháp này cho phép bạn giữ phân bổ ở mức tối thiểu bằng cách sử dụng lại các đối tượng mà bạn đã tạo trước đó. Nó cũng cho phép bạn các đối tượng vá lỗi của người Viking bằng cách cố tình ghi đè chúng bằng JSON chỉ chứa một tập hợp con nhỏ của các trường.

CẢNH BÁO: API serializer JSON hỗ trợ các lớp con monobehaviour và scriptableObject cũng như các cấu trúc và lớp đơn giản. Tuy nhiên, khi giảm giá JSON thành các lớp con của MonoBehaviour hoặc

MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
0, bạn phải sử dụng phương pháp FromjsonOverwrite. Nếu bạn cố gắng sử dụng Fromjson, Unity ném một ngoại lệ vì hành vi này không được hỗ trợ. The JSON Serializer API supports MonoBehaviour and ScriptableObject subclasses as well as plain structs and classes. However, when deserializing JSON into subclasses of MonoBehaviour or
MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
0, you must use the FromJsonOverwrite method. If you try to use FromJson, Unity throws an exception because this behavior is not supported.

Các loại được hỗ trợ

API serializer JSON hỗ trợ bất kỳ lớp con MonoBehaviour nào, lớp con

MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
0 hoặc lớp đơn giản hoặc cấu trúc với thuộc tính
MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
3. Khi bạn chuyển trong một đối tượng cho trình tuần tự thống nhất tiêu chuẩn để xử lý, các quy tắc và giới hạn tương tự được áp dụng như trong Thanh tra: Unity chỉ tuần tự hóa các trường; và các loại như
MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
4 không được hỗ trợ.

Unity không hỗ trợ truyền trực tiếp các loại khác vào API, chẳng hạn như các loại hoặc mảng nguyên thủy. Nếu bạn cần chuyển đổi chúng, hãy bọc chúng trong một loại

MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
5 hoặc
MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
6.

Chỉ trong biên tập viên, có một API song song, biên tập viên, cho phép bạn tuần tự hóa bất kỳ đối tượng nào có nguồn gốc từ UnityEngine. Điều này tạo ra JSON chứa dữ liệu giống như biểu diễn YAML của đối tượng.

JsonUtility và EditorJsonUtility là các lớp tiện ích để tuần tự hóa các đối tượng đến và từ định dạng chuỗi JSON bằng cách sử dụng các quy tắc tuần tự hóa Unity. Trong trường hợp cần thiết để điều khiển dữ liệu JSON thông qua mã hoặc để tuần tự hóa các cấu trúc dữ liệu mà sự tuần tự hóa Unity không hỗ trợ, bạn có thể sử dụng thư viện .NET JSON mục đích chung như một người bạn đồng hành với API jsonUtility.

Màn biểu diễn

Các bài kiểm tra điểm chuẩn chỉ ra rằng JsonUtility nhanh hơn đáng kể so với các giải pháp .NET JSON phổ biến, mặc dù lớp này cung cấp ít tính năng hơn trong một số trường hợp.

Việc sử dụng bộ nhớ cho Bộ sưu tập rác [GC] ở mức tối thiểu:

  • Tojson chỉ phân bổ bộ nhớ GC cho chuỗi được trả về.
  • Fromjson chỉ phân bổ bộ nhớ GC cho đối tượng được trả về, cũng như bất kỳ tiểu mục nào cần thiết [ví dụ: nếu bạn giảm dần một đối tượng chứa một mảng, thì Unity phân bổ bộ nhớ GC cho mảng].
  • FromJsonOverwrite chỉ phân bổ bộ nhớ GC khi cần thiết cho các trường viết [ví dụ: chuỗi và mảng]. Điều này có nghĩa là sự thống nhất hoàn toàn không phân bổ bất kỳ bộ nhớ GC nào nếu tất cả các trường được ghi đè bởi JSON được gõ giá trị.

Bạn có thể sử dụng API jsonUtility từ một luồng nền. Tuy nhiên, như với bất kỳ mã đa luồng nào, hãy cẩn thận không truy cập hoặc thay đổi một đối tượng trên một luồng trong khi một luồng khác đang tuần tự hóa hoặc giải phóng nó.

Kiểm soát đầu ra của Tojson []

Phương pháp Tojson hỗ trợ in đẹp đầu ra JSON. Nó bị tắt theo mặc định nhưng bạn có thể bật nó bằng cách chuyển

MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
7 làm tham số thứ hai.

Bạn có thể bỏ qua các trường từ đầu ra bằng cách sử dụng thuộc tính

MyClass myObject = new MyClass[];
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
8.

Sử dụng Fromjson [] với các loại không xác định

Nếu bạn không biết loại đối tượng trước thời hạn, hãy giảm giá JSON thành một lớp hoặc cấu trúc có chứa các trường phổ biến trên mạng và sau đó sử dụng các giá trị của các trường đó để tìm ra loại thực tế bạn muốn. Sau đó giảm dần lần thứ hai vào loại đó.

Lỗi tuần tự hóa kịch bản

Bài Viết Liên Quan

Chủ Đề