2013-01-23 41 views
6

Tôi muốn viết một serializer/deserializer .NET tùy chỉnh cho các thông báo FIX (không giống như XML). Về cơ bản các thông điệp được mã hóa như <tag>=<value>;<tag>=<value>;...Làm thế nào để viết một serializer tùy chỉnh POCO/deserializer?

Vì vậy, một mẫu người ta có thể là:

51=2;20=hello;31=2 

Tôi muốn sử dụng FIX Serializer lớp học của tôi tương tự như cách tôi sử dụng lớp XMLSerializer để có thể serialize/deserialize tin nhắn. Tôi sẽ tưởng tượng rằng tôi sẽ viết một lớp thông báo FIX như:

[Serializable] 
public class FixMessage 
{ 
    [FIXValuePair(51)] 
    public double Price { get; set; } 

    [FIXValuePair(20)] 
    public string SomethingElse { get; set; } 
} 

Bất kỳ con trỏ nào về cách tôi sẽ viết bộ nối tiếp/bộ cảm biến?

+1

Nhìn vào các dự án mã nguồn mở hiện có: JSV (từ ServiceStack), Json.NET, Protobuf.NET vv Rất nhiều mã hiện tại/tài liệu. Ngoài ra còn có một số thủ thuật [đơn giản] thường được áp dụng để tăng tốc tuần tự hóa hoặc cho phép các điểm tùy chỉnh, v.v. –

+1

@pst, bạn nên đặt câu trả lời đó như một câu trả lời. Điều đó rất hữu ích! – Denis

+0

Rất vui khi xem chi tiết khám phá/khách hàng tiềm năng/cách tiếp cận/kết quả tự trả lời :) –

Trả lời

6

Sử dụng phản ánh bạn có thể lặp qua các thuộc tính của đối tượng bạn đang sắp xếp, sau đó cho mỗi thuộc tính bạn có thể kiểm tra các thuộc tính (một lần nữa sử dụng sự phản chiếu). Và cuối cùng, bạn gửi đầu ra của bạn đến một dòng.

Mã của bạn có thể giống như thế này (giản thể):

public string Serialize(object o) 
{ 
    string result = ""; // TODO: use string builder 

    Type type = o.GeyType(); 

    foreach (var pi in type.GetProperties()) 
    { 
     string name = pi.Name; 
     string value = pi.GetValue(o, null).ToString(); 

     object[] attrs = pi.GetCustomAttributes(true); 
     foreach (var attr in attrs) 
     { 
      var vp = attr as FIXValuePairAttribute; 
      if (vp != null) name = vp.Name; 
     } 

     result += name + "=" + value + ";"; 
    } 

    return result; 
} 
+3

Và thay vì (hoặc thêm) đánh dấu thứ gì đó là «Serializable', bạn có thể thêm thuộc tính mới có tên là" FixSerializable '. Điều đó sẽ làm cho nó dễ dàng hơn để xác định các đối tượng như serializable dựa trên serializer FIX của bạn. –

+0

Tôi thấy những gì bạn đang nói. Có một số giao diện tôi có nghĩa vụ phải thực hiện? Bạn có bất kỳ ví dụ về những người khác viết một - tôi không thể tìm thấy bất kỳ vì vậy tôi tránh bất kỳ cạm bẫy? – Denis

+0

Eli, gọi tốt! – Denis