Tôi có một lớp hiện có để tuần tự hóa và deserializing các đối tượng đến/từ XML. Đó là một lớp chung với một tham số kiểu đơn T
chỉ có ràng buộc là where T : IXmlSerializable
. Tuy nhiên, tôi vẫn muốn có thể sử dụng lớp này trên các lớp không thực hiện IXmlSerializable
nhưng có thuộc tính [Serializable]
. Làm thế nào tôi có thể đi về việc này?Lớp tiện ích serialization C# generic
Từ lớp chung tôi:
public static class XmlSerializationUtils<T> where T : IXmlSerializable
{
public static T DeserializeXml(XmlDocument xml) { ... }
public static XmlDocument SerializeToXml(T toSerialize) { ... }
}
tôi thấy this discussion nhưng không có giải pháp nào đó, chỉ là tôi không thể làm where T : Serializable
. Cố gắng làm where T : SerializableAttribute
làm cho Visual Studio nói "Không thể sử dụng lớp niêm phong 'System.SerializableAttribute' như ràng buộc tham số kiểu".
Edit: dựa trên Stephen's answer, tôi loại bỏ các hạn chế về XmlSerializationUtils<T>
và thêm vào constructor tĩnh này:
static XmlSerializationUtils()
{
Type type = typeof(T);
bool hasAttribute = null != Attribute.GetCustomAttribute(type,
typeof(SerializableAttribute));
bool implementsInterface =
null != type.GetInterface(typeof(IXmlSerializable).FullName);
if (!hasAttribute && !implementsInterface)
{
throw new ArgumentException(
"Cannot use XmlSerializationUtils on class " + type.Name +
" because it does not have the Serializable attribute " +
" and it does not implement IXmlSerializable"
);
}
}
Đó không phải là giải pháp không hợp lý. –
Vâng, tôi đồng ý, nó đang được một nhà phát triển sử dụng, những người không biết liệu lớp anh ta đang cố gắng nối tiếp có thể thay đổi được không, nếu anh ta sử dụng sai nó là ngoại lệ, bạn không thể loại bỏ mọi lỗi có thể xảy ra trong thời gian biên dịch. –
@Ben: Chúng tôi không thể luôn luôn làm như vậy, nhưng chúng tôi chắc chắn nên cố gắng để bắt lỗi sớm và thường xuyên. Trong trường hợp này, chúng ta không thể bắt nó ở thời gian biên dịch, nhưng nếu chúng ta sử dụng thủ thuật xây dựng tĩnh, chúng ta có thể bắt nó vào lúc bắt đầu chạy (nghĩa là kiểm tra khói sau biên dịch sẽ không bỏ lỡ nó). –