Tôi đang đối mặt với một vấn đề rất khó chịu mà tôi không thể xác định.
Tôi đang chạy một ứng dụng ASP.Net rất lớn có chứa hàng nghìn đối tượng; Nó sử dụng serialization/deserialization trong bộ nhớ với MemoryStream để sao chép trạng thái của ứng dụng (hợp đồng bảo hiểm) và chuyển nó vào các module khác. Nó hoạt động tốt trong nhiều năm. Bây giờ thỉnh thoảng, không có hệ thống, trong serialization nó ném ngoại lệPhương thức khởi tạo mảng byte thập phân trong Binaryformatter Serialization
Decimal constructor mảng byte yêu cầu một mảng có độ dài Bốn chứa byte thập phân hợp lệ.
Chạy cùng một ứng dụng với cùng một dữ liệu, 3 lần trong số 5 hoạt động. Tôi đã bật tất cả ngoại lệ CLR, Gỡ lỗi - Ngoại lệ - CLR ngoại lệ - Đã bật, vì vậy tôi đoán rằng nếu khởi tạo sai/gán cho trường thập phân xảy ra, chương trình sẽ dừng lại. Nó không xảy ra.
Tôi đã cố gắng phân chia tuần tự hóa trong nhiều đối tượng tiểu học hơn nhưng rất khó, để xác định trường gây ra sự cố. Từ phiên bản đang hoạt động trong sản xuất và phiên bản này tôi đã chuyển từ .Net 3.5 sang .NET 4.0 và những thay đổi nhất quán đối với phần giao diện người dùng, không phải là phần kinh doanh, đã được thực hiện. Kiên nhẫn tôi sẽ trải qua tất cả các thay đổi.
Dường như vấn đề C lỗi thời cũ khi char *p
đang viết ở nơi không nên, và chỉ trong quá trình tuần tự hóa khi kiểm tra tất cả các vấn đề dữ liệu xuất hiện.
Có điều gì đó giống như điều này trong môi trường được quản lý của .Net không? Ứng dụng này rất lớn nhưng tôi không thể thấy sự tăng trưởng bộ nhớ bất thường. Điều gì có thể là một cách để gỡ lỗi và theo dõi sự cố?
Dưới đây là một phần của stacktrace
[ArgumentException: Decimal byte array constructor requires an array of length four containing valid decimal bytes.]
System.Decimal.OnSerializing(StreamingContext ctx) +260
[SerializationException: Value was either too large or too small for a Decimal.]
System.Decimal.OnSerializing(StreamingContext ctx) +6108865
System.Runtime.Serialization.SerializationEvents.InvokeOnSerializing(Object obj, StreamingContext context) +341
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +448
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +969
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +1016
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +319
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph) +17
Allianz.Framework.Helpers.BinaryUtilities.SerializeCompressObject(Object obj) in D:\SVN\SUV\branches\SUVKendo\DotNet\Framework\Allianz.Framework.Helpers\BinaryUtilities.cs:98
Allianz.Framework.Session.State.BusinessLayer.BLState.SaveNewState(State state) in
Xin lỗi vì những câu chuyện dài và câu hỏi không xác định, tôi thực sự sẽ đánh giá cao sự giúp đỡ nào.
Tôi gặp lỗi tương tự, hóa ra là do liên kết (sử dụng StructLayout (LayoutKind.Explicit)) w ở đây tôi đã giải thích một bool như một số thập phân vô tình. Phần còn lại của ứng dụng sử dụng số thập phân như bình thường 0, nhưng chỉ trong quá trình deserialization trong một ứng dụng riêng biệt nó sẽ ném lỗi này, tôi nhận ra vấn đề bằng cách làm Decimal.GetBytes trước khi serialization và chú ý thứ 3 đến byte cuối cùng là 1 thay vì 0 như mong đợi. – BrandonAGr