Một tham chiếu vòng tròn đã được phát hiện khi tuần tự hóa đối tượng của lớp

Tôi biết rằng một tùy chọn ở đây là thêm thuộc tính XmlIgnore để bộ sưu tập không được đánh số thứ tự. Nhưng vì tôi cần bộ sưu tập được tuần tự hóa, nên tùy chọn duy nhất của tôi ở đây là tạo 2 đối tượng Nhóm khác nhau sao cho đối tượng được sử dụng bên trong bộ sưu tập là một lớp khác chỉ vì mục đích của bộ nối tiếp CLR biết cái nào là cái nào?

Lỗi tham chiếu vòng sẽ xảy ra khi tuần tự hóa các thực thể POCO tham chiếu lẫn nhau. Ví dụ, xem xét mối quan hệ giữa các thực thể Đặt hàng và Khách hàng. Ở đây quan hệ Đơn hàng và Khách hàng được tham chiếu lẫn nhau

Hình 1. Mối quan hệ giữa Đơn đặt hàng và Quan hệ khách hàng

Khi bộ tuần tự hóa JSON cố tuần tự hóa đối tượng thực thể “Đơn hàng” với mối quan hệ trên, nó sẽ cố tuần tự hóa đối tượng quan hệ “Khách hàng” của nó và trong khi duyệt qua đối tượng “Khách hàng”, nó phát hiện ra tham chiếu vòng và đưa ra ngoại lệ tham chiếu vòng

Giải pháp

Khi sử dụng EF hoặc LINQ to SQL, lỗi tham chiếu vòng tròn có thể được khắc phục bằng một trong các cách sau

Đặt mức độ hiển thị của thuộc tính Điều hướng

Nếu Entity Framework được sử dụng, thì hãy đặt mức độ hiển thị của thuộc tính điều hướng là nội bộ trong cửa sổ thuộc tính như sau

Khuôn khổ thực. Đặt quyền truy cập là nội bộ cho thuộc tính điều hướng

Khi sử dụng EF, bạn cũng có thể tắt tính năng tạo proxy như sau để ngăn chặn việc tạo proxy, điều này sẽ tránh được lỗi tham chiếu vòng tròn

Đối với LINQ to SQL, hãy đặt Thuộc tính trẻ em thành sai hoặc đặt Quyền truy cập là nội bộ trong cửa sổ thuộc tính của mối quan hệ cụ thể

               

LINQ sang SQL. Đặt quyền truy cập là nội bộ cho thuộc tính điều hướng

Sử dụng Đối tượng truyền dữ liệu hoặc Mô hình xem

Đây là cách an toàn và được khuyên dùng nhất để tránh lỗi tham chiếu vòng tròn, vì nó chỉ liên quan đến việc đánh số thứ tự các thuộc tính được yêu cầu mà không làm lộ trực tiếp thực thể POCO

Ngoài việc tránh lỗi tham chiếu vòng tròn, nó còn giúp làm cho đối tượng có trọng lượng nhẹ bằng cách loại trừ các thuộc tính mà khách hàng có thể nhìn thấy, từ đó giảm kích thước tải trọng trong khi truyền

Cách sử dụng Bộ nối tiếp¶. Symfony cung cấp một bộ tuần tự hóa để tuần tự hóa/giải tuần tự hóa đến và từ các đối tượng và các định dạng khác nhau [e. g. JSON hoặc XML]. Trước khi sử dụng, hãy đọc tài liệu thành phần Bộ nối tiếp để làm quen với triết lý của nó cũng như thuật ngữ của bộ chuẩn hóa và bộ mã hóa

Theo cách tương tự, Trình chuẩn hóa sẽ xử lý việc biến các đối tượng cụ thể thành mảng và ngược lại. Tuần tự hóa là một chủ đề phức tạp. Thành phần này có thể không bao gồm tất cả các trường hợp sử dụng của bạn, nhưng nó có thể hữu ích cho việc phát triển các công cụ để tuần tự hóa và giải tuần tự hóa các đối tượng của bạn

Tôi cần giải tuần tự hóa mảng đối tượng được lập chỉ mục từ tệp YAML. #php #serialization #symfony. Để lại một câu trả lời Hủy trả lời 0. Địa chỉ email của bạn sẽ không được công bố

Bình thường hóa¶. Trình chuẩn hóa biến đối tượng thành mảng và ngược lại. Họ triển khai Symfony\Component\Serializer\Normalizer\NormalizerInterface để chuẩn hóa [đối tượng thành mảng] và Symfony\Component\Serializer\Normalizer\DenormalizerInterface để chuẩn hóa [mảng thành đối tượng]

Sử dụng trình nối tiếp JSON làm cho các thông báo dễ đọc hơn rất nhiều. Nhưng vẫn có những trường hợp điều này là không đủ hoặc thậm chí có thể là một bước lùi so với trình nối tiếp mặc định. Ví dụ: khi sử dụng UUID. Khi bạn muốn có cái này, bạn cần xác định bộ nối tiếp tùy chỉnh

Điều này hoạt động hơi khác so với trình tạo bối cảnh - nó hoạt động giống hệ thống cử tri hơn. Bộ nối tiếp không chỉ có một bộ chuẩn hóa, nó có nhiều bộ chuẩn hóa. Mỗi lần nó cần chuẩn hóa thứ gì đó, nó sẽ lặp lại tất cả các trình chuẩn hóa, gọi supportsNormalization[] và chuyển cho chúng tôi dữ liệu mà nó cần để chuẩn hóa

Không, thay vì yêu cầu bộ nối tiếp lặp lại tất cả các bộ chuẩn hóa để tìm đúng bộ chuẩn hóa để sử dụng, chúng tôi đã vô tình tự động nối dây chỉ một bộ chuẩn hóa cụ thể và đang sử dụng nó. Về cơ bản, thay vì sử dụng ItemNormalizer để thực hiện tất cả các ưu điểm của ObjectNormalizer và sau đó thêm các trường JSON-LD, chúng tôi đang sử dụng trực tiếp ObjectNormalizer

Khóa circle_reference_limit trong ngữ cảnh mặc định đặt số lần nó sẽ tuần tự hóa cùng một đối tượng trước khi coi nó là một tham chiếu vòng. Giá trị mặc định là 1. Thay vì đưa ra một ngoại lệ, các tham chiếu vòng tròn cũng có thể được xử lý bằng các cuộc gọi tùy chỉnh

Câu hỏi của anh chị em tại đây Một tham chiếu vòng đã được phát hiện khi tuần tự hóa đối tượng của lớp "Ứng dụng\Thực thể\Người dùng" [giới hạn được định cấu hình. 1]

Bạn có thể sử dụng khái niệm nhóm như được mô tả trong tài liệu chính thức

Bạn cũng có thể tạo trình xử lý tham chiếu vòng để xử lý nó. Ví dụ: trong bộ điều khiển của bạn, bạn có thể tuần tự hóa thực thể Danh mục như

findAll[];

        $circularRefHandler = fn[$catalog, $format, $context]=> $catalog->getName[];

        $context = [
            AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => $circularRefHandler
        ];

        $catalogsJson = $serializer->serialize[$catalogs, 'json', $context];


        return $this->json[[
            'catalogs' => $catalogsJson
        ]];
    }
}


Nếu bạn muốn sử dụng GetSetMethodNormalizer, hãy tạo ngữ cảnh với GetSetMethodNormalizerContextBuilder

Chủ Đề