7

Tôi đang sử dụng ServiceStack.OrmLite để lưu giữ dữ liệu trong cơ sở dữ liệu SQLite và khá hài lòng với nó cho đến nay.Làm thế nào tôi có thể tùy chỉnh tuần tự hóa/deserialization của một loại phức tạp trong ServiceStack.OrmLite

Tuy nhiên, nhiều đối tượng của tôi có các thuộc tính thuộc loại phức tạp mà tôi không muốn được tuần tự hóa bằng cách sử dụng JSV.

Tôi cần có khả năng chỉ định một chuỗi tuần tự hóa/deserialization tùy chỉnh nên được sử dụng để lưu trữ thuộc tính trong cơ sở dữ liệu (dưới dạng chuỗi). Trong thế giới db4o, điều này sẽ tương đương với việc sử dụng tính năng dịch được cung cấp bởi IObjectConstructor.

Ví dụ về các loại phức tạp không thể được tuần tự hóa và deserialized đúng là loại NodaTime, mặc dù chúng có thể dễ dàng ánh xạ tới chuỗi (tôi đã có các chức năng tuần tự hóa/deserialization mà tôi đã sử dụng với db4o).

Cách đơn giản nhất để đạt được điều đó là gì? Một trình bao bọc sẽ không thuận tiện lắm vì tôi sẽ phải viết và duy trì một cho mỗi loại có chứa thuộc tính của kiểu phức tạp này.

+0

Xin vui lòng, đưa ra một ví dụ làm việc tối thiểu của một lớp học, bạn muốn làm thế nào để nó và làm thế nào để deserelize nó. – htellez

+0

Nó rất đơn giản, tôi có một lớp cơ bản với một thuộc tính có kiểu phức tạp. Tôi cần tài sản này để được tuần tự hóa/deserialized vào/từ một chuỗi bằng cách sử dụng thói quen của riêng tôi chứ không phải là JSV. Tôi không nghĩ rằng một mẫu mã thực sự cần thiết trong trường hợp cụ thể này. –

Trả lời

6

Đối với những người có thể quan tâm đến mẫu trình bao bọc mà tôi hiện đang sử dụng để triển khai thực hiện tuần tự hóa tùy chỉnh với OrmLite (cũng làm việc với các ORM khác), đây là một ví dụ làm việc đơn giản với NodaTime loại mà nếu không đã không đăng đúng:

public class BusinessObject { 
    public class Poco { 
     public readonly BusinessObject BusinessObject; 

     public Poco(BusinessObject businessObject) { 
      this.BusinessObject = businessObject; 
     } 

     public Poco() { 
      this.BusinessObject = new BusinessObject(); 
     } 

     public string Id { 
      get { return this.BusinessObject.Id; } 
      set { this.BusinessObject.Id = value; } 
     } 

     public decimal Amount { 
      get { return this.BusinessObject.Amount; } 
      set { this.BusinessObject.Amount = value; } 
     } 

     public DateTime Dt { 
      get { return this.BusinessObject.Dt.ToDateTime(); } 
      set { this.BusinessObject.Dt = LocalDateTime.FromDateTime(value).Date; } 
     } 

     public string TimeZone { 
      get { return this.BusinessObject.TimeZone.Id; } 
      set { this.BusinessObject.TimeZone = DateTimeZoneProviders.Tzdb.GetZoneOrNull(value); } 
     } 

     public string Description { 
      get { return this.BusinessObject.Description; } 
      set { this.BusinessObject.Description = value; } 
     } 
    } 

    public string Id { get; private set; } 
    public decimal Amount { get; private set; } 
    public LocalDate Dt { get; private set; } 
    public DateTimeZone TimeZone { get; private set; } 
    public string Description { get; private set; } 

    public BusinessObject() { } 

    public BusinessObject(string id, decimal amount, LocalDate dt, DateTimeZone timeZone, string description) { 
     this.Id = id; 
     this.Amount = amount; 
     this.Dt = dt; 
     this.TimeZone = timeZone; 
     this.Description = description; 
    } 
} 

Tôi hy vọng nó sẽ sớm có thể để xác định móc/callbacks với nhiều loại cụ thể mà cần được xử lý với mã tùy chỉnh, và cũng là OrmLite sẽ cho phép tính với setters tin được tải lại từ sự kiên trì (hiện tại nó sẽ chỉ hoạt động theo một hướng).

Cập nhật (2014/03/08): Là một workaround tạm thời, nó có thể có OrmLite sử dụng tùy chỉnh serialization/deserialization bằng cách gọi đầu tiên:

JsConfig<BusinessObject>.TreatValueAsRefType = true; 

Thậm chí nếu BusinessObject là một loại tài liệu tham khảo. Sau đó, bạn có thể thưởng thức vẻ đẹp/đơn giản/mặt khắp nơi của:

JsConfig<BusinessObject>.RawSerializeFn = bo => bo.Serialize(); 
JsConfig<BusinessObject>.RawDeserializeFn = str => BusinessObject.Deserialize(str); 

Hy vọng hỗ trợ cho lập bản đồ tùy chỉnh sẽ được bổ sung sớm (do đó ví dụ như một NodaTime.LocalDate có thể được ánh xạ tới một DateTime thay vì một chuỗi).

+0

Tôi thực sự không thấy các trình cài đặt riêng tư có thể được tải ra bên ngoài như thế nào, hoặc liệu chúng có nên được tải không. 'bảo vệ' có thể làm việc, mặc dù. – ANeves

+1

Trình cài đặt riêng có thể truy cập bằng Phản chiếu. –

2

OrmLite hiện hỗ trợ pluggable text serializers.

serialization Pluggable phép bạn chỉ định các chiến lược serialization khác nhau của các loại phức tạp đối với từng nhà cung cấp RDBMS có sẵn, ví dụ:

//ServiceStack's JSON and JSV Format 
SqliteDialect.Provider.StringSerializer = new JsvStringSerializer();  
PostgreSqlDialect.Provider.StringSerializer = new JsonStringSerializer(); 
//.NET's XML and JSON DataContract serializers 
SqlServerDialect.Provider.StringSerializer = new DataContractSerializer(); 
MySqlDialect.Provider.StringSerializer = new JsonDataContractSerializer(); 
//.NET XmlSerializer 
OracleDialect.Provider.StringSerializer = new XmlSerializableSerializer(); 

Bạn cũng có thể cung cấp một chiến lược tùy chỉnh serialization bằng cách thực hiện IStringSerializer:

public interface IStringSerializer 
{ 
    To DeserializeFromString<To>(string serializedText); 
    object DeserializeFromString(string serializedText, Type type); 
    string SerializeToString<TFrom>(TFrom from); 
} 
2

Để serialize loại phức tạp, thiết lập serializer của riêng bạn (và deserializer) trên JsConfig:

JsConfig<Foo>.SerializeFn = foo => foo.ToString("XOXO", CultureInfo.InvariantCulture); 
JsConfig<Foo>.DeSerializeFn = foo => 
{ 
    var result = Foo.Parse(foo, CultureInfo.InvariantCulture); 
    return result; 
}; 

Bạn cũng có thể muốn nói với JsConfig để giả UTC ngày:

JsConfig.AssumeUtc = true; 
+0

Tính năng này có hoạt động với OrmLite không? Tôi biết nó làm việc với ServiceStack, nhưng theo như tôi đã đọc và thử nghiệm với mã của tôi nó đã không được đưa vào tài khoản cho serialization OrmLite. –

+0

. Nhưng tôi đang gặp [rắc rối với việc tuần tự hóa các cấu trúc] (http://stackoverflow.com/questions/20246508/make-ormlite-use-proper-serialization-for-structs). (Deserialization hoạt động tốt. Và cho các loại tài liệu tham khảo cả hai làm việc tốt - serialization và deserialization.) – ANeves

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