직렬화 된 클래스 (요소라는 이름)의 배열이있는 클래스가 있습니다. 이 클래스를 직렬화 한 다음이를 역 직렬화하고 싶습니다. 그러나 역 직렬화는 어렵습니다.
직렬화되기 전에 배열의 요소 유형을 모르기 때문에 두 개의 배열이 요소 배열과 일치합니다. 하나 ( typeOfElements
)는 요소 유형을 유지하고 다른 ( serializedElemnt
)은 직렬화 된 요소 문자열을 유지합니다. 하지만 내 주 요소 배열을 만드는 방법을 deserialize 한 후에는 모르겠습니다. 기본 배열을 만들기 위해 유형을 클래스로 변환하려면 어떻게해야합니까?
[ProtoContract]
class MyClass
{
.
.
public MyClass()
{
}
object[] elements;
[ProtoMember(1)]
string[] SerilizedElements;
[ProtoMember(2)]
string[] TypeOfElements;
[ProtoBeforeSerialization]
void initBeforeSerilize()
{
TypeOfElements = new string[elements.Length];
SerilizedElements = new string[elements.Length];
for (int i = 0; i < elements.Length; i++)
{
TypeOfElements[i] = elements[i].GetType().ToString();
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize(ms, elements[i]);
SerilizedElements[i] = Encoding.UTF8.GetString(ms.ToArray());
}
}
}
[ProtoAfterDeserialization]
void initAfterSerilize()
{
for (int i = 0; i < SerilizedElements.Length; i++)
{
Type t = Type.GetType(TypeOfElements[i]);
using(MemoryStream ms=new MemoryStream(Encoding.ASCII.GetBytes(SerilizedElements[i])))
{
//I don't know how to write this line
elements[i]=Serializer.Deserialize<t>(ms);
}
}
}
}
"I only know the type at runtime"문제의 경우 Serializer.NonGeneric
를 참조하십시오 Type
. 여기 에는 . 비 일반 API는 v2 API의 기본 API이기도합니다 TypeModel
. 문자열 인코딩 문제는 이미 언급되었습니다. 문자열이 필요하면 base-64를 사용해야하지만 개인적으로 byte[]
. 또한 알 수없는 유형 대신 상속을 사용할 수 있는지 여부에 대해 생각하는 것이 좋습니다. 후보 유형의 수가 유한하고 알려진 경우 이는 확실히 가능합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다