2009-05-03 20 views
6

Tôi có một tệp và cần phải tuần tự hóa nhiều đối tượng của cùng một lớp khi một đối tượng mới được tạo. Tôi không thể lưu trữ chúng trong mảng như tôi cần serialize chúng dụ một đối tượng được tạo ra. Làm ơn giúp tôi.Tôi có một Tệp Đơn và cần phải tuần tự hóa nhiều đối tượng một cách ngẫu nhiên. Làm thế nào tôi có thể trong C#?

+1

Bạn có ý nghĩa gì với ngẫu nhiên? –

+0

Tôi nghĩ bạn cần phải làm rõ tiếng Anh của bạn. –

+0

Bạn có lưu các đối tượng vào "tệp đơn" đó và truy xuất chúng trở lại từ nó không? Khi bạn nói rằng bạn muốn "serialize" các đối tượng ngay sau khi chúng được tạo ra, bạn có nghĩa là bạn muốn lưu chúng vào tập tin đó? – DOK

Trả lời

0

Xem câu trả lời here.

Tóm lại, chỉ cần tuần tự hóa mọi thứ vào cùng một luồng tệp và sau đó deserialize. dotNet sẽ biết kích thước của từng đối tượng

7

Bạn đang sử dụng cơ chế tuần tự nào? XmlSerializer có thể là một vấn đề vì nút gốc và những thứ như khai báo không gian tên, có một chút khó khăn để có được shot - cộng với nó không phải là tuyệt vời tại deserializations một phần. BinaryFormatter rất dễ bắt đầu - Tôi không khuyên bạn nên sử dụng nó trong hầu hết các trường hợp.

Một tùy chọn có thể là protobuf-net; đây là bộ nối tiếp nhị phân (sử dụng định dạng "bộ đệm giao thức" của Google - hiệu quả, di động và khả năng chịu phiên bản). Bạn có thể tuần tự hóa nhiều đối tượng vào luồng với Serializer.SerializeWithLengthPrefix. Để deserialize các mục tương tự, Serializer.DeserializeItems trả về một IEnumerable<T> của các mục được deserialized - hoặc bạn có thể dễ dàng thực hiện TryDeserializeWithLengthPrefix công khai (hiện tại là riêng tư, nhưng nguồn có sẵn).

Chỉ cần viết từng đối tượng vào tệp sau khi bạn đã tạo - hoàn thành công việc.

Nếu bạn muốn có ví dụ, vui lòng nói - mặc dù đơn vị kiểm tra here cung cấp tổng quan.

Nó sẽ về cơ bản là một cái gì tương tự (chưa được kiểm tra):

using(Stream s = File.Create(path)) 
{ 
    Serializer.SerializeWithLengthPrefix(s, command1, PrefixStyle.Base128, 0); 
    ... your code etc 
    Serializer.SerializeWithLengthPrefix(s, commandN, PrefixStyle.Base128, 0); 
} 
... 
using(Stream s = File.OpenRead(path)) { 
    foreach(Command command in 
      Serializer.DeserializeItems<Command>(s, PrefixStyle.Base128, 0)) 
    { 
     ... do something with command 
    } 
} 
+0

Tôi biết tôi đến trễ cho bữa tiệc nhưng bạn có nghĩ đến việc xây dựng trên * 'BinaryFormatter rất dễ bắt đầu - Tôi không khuyên bạn nên dùng nó trong hầu hết các trường hợp. '* Tại sao nó lại giòn? Tại sao bạn không giới thiệu nó? Đã một lúc kể từ khi câu trả lời này có thể bạn có thể giới thiệu một cách khác để tuần tự hóa nhiều đối tượng thành một tệp/nhiều tệp? –

+1

@mehow chắc chắn: BinaryFormatter là phiên bản rất không dung nạp/tái cấu trúc: rất dễ làm cho nó không thể deserialize các tập tin hiện có khi thay đổi ... tốt, bất cứ điều gì thẳng thắn. Nó cũng là các tùy chọn hạn chế và khung nền tảng và nền tảng. Nó cũng là không cần thiết cồng kềnh và không hiệu quả, và có một số "gotchas". Đối với câu hỏi khác của bạn: tôi là một thiên vị, nhưng tôi sẽ nói rằng protobuf-net địa chỉ tất cả những điều này. Đó là, sau khi tất cả, mục tiêu thiết kế :) protobuf-net là hoàn toàn hài lòng với nhiều đối tượng trong một dòng, miễn là các phương pháp * WithLengthPrefix được sử dụng. –

+0

Cảm ơn bạn Tôi đánh giá cao nó –

0

Đối với mỗi đối tượng mà đến, chúng tôi sẽ chuyển đổi nó thành một chuỗi Base64Encoded và lưu nó như một dòng trong một file văn bản. Vì vậy, trong tệp này, mỗi hàng sẽ có một đối tượng được tuần tự trên mỗi dòng. Trong khi đọc chúng ta sẽ đọc từng dòng một tập tin và deserialize chuỗi mã hóa Base64 này vào đối tượng của chúng ta. Dễ dàng .. vì vậy hãy thử mã.

http://www.codeproject.com/KB/cs/serializedeserialize.aspx?display=Print

Các vấn đề liên quan