2011-12-20 28 views
6

Tôi đang viết một số mã C# .net để lưu một số giá trị vào sổ đăng ký. Nó hoạt động tốt cho đến khi tôi muốn lưu một số dữ liệu nhị phân.Lưu đối tượng serializable để đăng ký trong .net?

Tôi có một đối tượng List<MyType> nơi MyType trông như thế này:

[Serializable] public class MyType 
{ 
public string s {get;set;} 
public string t {get;set;} 
} 

tôi nhận được một lỗi với đoạn mã sau:

List<MyType> objectToSaveInRegistry = getList(); 
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(MySpecialKey, true); 
registryKey.SetValue("MySpecialValueName", objectToSaveInRegistry , RegistryValueKind.Binary); 

Lỗi này là: "Các loại đối tượng giá trị đã làm không khớp với giá trị RegistryKind đã chỉ định hoặc đối tượng không thể được chuyển đổi đúng cách. "

Tôi có thể làm gì để tôi có thể lưu đối tượng trong sổ đăng ký?

+0

tại sao bạn muốn lưu nó trong sổ đăng ký. Tại sao bạn không đặt tệp đó thành tệp xml và lưu tệp. –

+1

@Srinivas, đối tượng của tôi chứa thông tin về cấu hình của ứng dụng tôi đang phát triển. Windows Registry có phải là nơi lưu cài đặt ứng dụng không? –

+2

Bạn đang cố gắng chuyển một Danh sách đến một phương thức cơ bản đang mong đợi một mảng byte. Bạn sẽ cần phải chuyển đổi danh sách của bạn thành kiểu đại diện đó (hoặc bằng cách tuần tự hóa vào một MemoryStream, hoặc sử dụng một bộ nối tiếp khác). – Joe

Trả lời

16

Bạn có thể cần sắp xếp lại đối tượng của mình trước tiên với sự trợ giúp của BinaryFormatter và lưu trữ nó trong một mảng byte mà sau đó bạn có thể chuyển đến SetValue. Tôi nghi ngờ rằng SetValue sẽ tuần tự hóa đối tượng cho bạn.

dụ nhanh:

using (var ms = new MemoryStream()) 
{ 
    var formatter = new BinaryFormatter(); 
    formatter.Serialize(ms, objectToSaveInRegistry); 
    var data = ms.ToArray(); 
    registryKey.SetValue("MySpecialValueName", data, RegistryValueKind.Binary); 
} 
+3

@ChrisWue thử này 'ms.WriteByte (1); Console.WriteLine (ms.GetBuffer(). Length + "" + ms.ToArray(). Chiều dài) 'Đầu ra:' 256 1' –

0

tôi sẽ lưu trữ các giá trị nguyên thủy và sau đó làm ẩm một poco khi dữ liệu được kéo trái ngược với lưu trữ poco riêng của mình.

+1

Bạn đang nói về cái gì? – IllidanS4

+0

@ IllidanS4: Anh ta lưu trữ các thuộc tính cá nhân của đối tượng dưới dạng các khóa riêng lẻ và sau đó xây dựng lại đối tượng từ các khóa đó thay vì lưu trữ đối tượng được tuần tự hóa trong một khóa duy nhất. Lợi thế sẽ là bạn có thể dễ dàng thao tác các thuộc tính riêng lẻ (giả sử bạn ánh xạ tất cả các con đường xuống các kiểu nguyên thủy) - mặc dù điều này cũng có thể được xem là một bất lợi. – ChrisWue

+0

@ChrisWue Và bốn năm sau, tôi vẫn không hiểu được nội dung của câu trả lời. Tốt đẹp! – IllidanS4

2

Tốt hơn là tuần tự hóa/unserialize đối tượng của bạn dưới dạng chuỗi. Trong ví dụ sau, tôi sử dụng tuần tự hóa XML. Biến "value" là đối tượng danh sách để lưu trữ trong sổ đăng ký.

// using Microsoft.Win32; 
// using System.IO; 
// using System.Text; 
// using System.Xml.Serialization; 

string objectToSaveInRegistry; 

using(var stream=new MemoryStream()) 
{ 
    new XmlSerializer(value.GetType()).Serialize(stream, value); 
    objectToSaveInRegistry=Encoding.UTF8.GetString(stream.ToArray()); 
} 

var registryKey=Registry.LocalMachine.OpenSubKey("MySpecialKey", true); 
registryKey.SetValue("MySpecialValueName", objectToSaveInRegistry, RegistryValueKind.String); 
+1

Tại sao nó tốt hơn? – Traubenfuchs

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