일반적인 방법으로 직렬화 할 수있는 것을 포함시키기 위해 유형 제약 조건을 추가하려면 어떻게해야합니까?
-
09-09-2019 - |
문제
내 일반적인 방법은 객체를 통과 한 객체를 직렬화해야하지만, iserializable이 작동하지 않는다고 주장하면 예를 들어, 웹 서비스 (SerializableAttribute로 표시됨)에서 구조물이 반환되어 XML로 직렬화되어 예상대로 C# 컴파일러가 불평합니다.
객체를 직렬화하기 전에 직렬화 할 수 있는지 확인할 수있는 방법이 있습니까? where
객체를 확인하는 키워드가 적합합니까?
내 전체 방법은 다음과 같습니다.
public static void Push<T>(string url, T message)
where T : ISerializable
{
string xml = SerializeMessage(message);
// Send the message to Amazon SQS
SendMessageRequest sendReq = new SendMessageRequest { QueueUrl = url, MessageBody = xml };
AmazonSQSClient client = new AmazonSQSClient(S3User, S3Pass);
client.SendMessage(sendReq);
}
Serializemessage :
private static string SerializeMessage<T>(T message)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (StringWriter stringWriter = new StringWriter())
{
xmlSerializer.Serialize(stringWriter, message);
return stringWriter.ToString();
}
}
이것이 불가능한 경우 런타임에 객체를 직렬화 할 수 있는지 확인하는 가장 좋은 방법은 무엇입니까?
해결책
일반적인 제약을 통해 완전히 할 수는 없지만 도움을 줄 몇 가지 작업을 수행 할 수 있습니다.
1) 새로운() 일반 유형의 제약 조건 (XMLSerializer가 기본 CTOR의 부족에 대해 불평하지 않도록 할 수있는 능력을 가능하게합니다) :
where T : new()
2) 메소드의 첫 번째 줄에서 직렬화 (또는 생성자 또는 반복적으로 반복 할 필요가없는 다른 곳) 에서이 점검을 수행 할 수 있습니다.
if( !typeof(T).IsSerializable && !(typeof(ISerializable).IsAssignableFrom(typeof(T)) ) )
throw new InvalidOperationException("A serializable Type is required");
물론 유형을 직렬화하려고 할 때 런타임 예외가 여전히있을 가능성이 있지만 가장 명백한 문제를 다룰 것입니다.
다른 팁
나는 당신이 도움이 될 수있는이 주제에 대한 길이의 블로그 기사를 썼습니다. 주로 이진 직렬화로 들어가지만 개념은 대부분의 직렬화 형식에 적용됩니다.
길고 짧은 것입니다
- 신뢰할 수있는 일반적인 제약 조건을 추가 할 방법이 없습니다.
- 물체가 확인하고 확인하는 유일한 방법 ~였다 직렬화 가능한
객체가 직렬화 할 수 있는지 알 수있는 유일한 방법은 직렬화를 시도하는 것입니다.
실제로, 당신은 유형이 "직렬화 가능하다"고 말하는 방법을 묻고 있었지만 실제 질문은 객체와 관련이 있습니다. 유형이 [직렬화 가능]으로 표시되어 있더라도 유형의 일부 인스턴스는 직렬화 할 수 없을 수 있습니다. 예를 들어, 인스턴스에 원형 참조가 포함되어 있으면 어떻게됩니까?
대신에
xmlserializer xmlserializer = new xmlserializer (typeof (t));
노력하다
xmlserializer xmlserializer = new xmlserializer (message.gettype ());