1
내 serializer는 속성 및 필드를 serialize합니다.
사용자 지정 복합 유형이 있으면 serializer가 작동하지 않습니다.
사용자 정의 복합 유형의 직렬화를 추가하고 순환 순회를 수행 할 수 있습니다. 프로그래밍에 익숙하지 않고 솔직히 재귀 순회를 다룰 기회가 없었습니다.재귀 순회를 통해 직렬화하는 방법은 무엇입니까?
internal class MySerializer
{
private Type targetType;
public MySerializer(Type targetType)
{
this.targetType = targetType;
if (!targetType.IsDefined(typeof (DataContractAttribute), false))
throw new Exception("No soup for you");
}
public void WriteObject(Stream stream, Object graph)
{
IEnumerable<MemberInfo> serializbleMembers =
targetType.GetMembers(BindingFlags.GetField | BindingFlags.GetProperty | BindingFlags.Instance |
BindingFlags.Public | BindingFlags.NonPublic)
.Where(p => p.IsDefined(typeof (DataMemberAttribute), false));
var writer = new StreamWriter(stream);
writer.WriteLine("<" + targetType.Name + ">");
foreach (MemberInfo memberInfo in serializbleMembers)
{
writer.Write("\t<" + memberInfo.Name + ">");
var fieldInfo = memberInfo as FieldInfo;
if (fieldInfo != null)
{
writer.Write(fieldInfo.GetValue(graph).ToString());
}
var propInfo = memberInfo as PropertyInfo;
if (propInfo != null)
{
writer.Write(propInfo.GetValue(graph, null).ToString());
}
writer.Write("</" + memberInfo.Name + ">");
}
writer.WriteLine("</" + targetType.Name + ">");
writer.Flush();
}
}
[DataContract]
class Person
{
[DataMember]
public string _family;
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public int Age { get; set; }
}
귀하의 질문을 이해하는 한, 당신은 자신의 시리얼 라이저를 쓰고 싶습니까? 어떤 요구 사항을 강요하는지 자세히 설명해 주시겠습니까? 당신이 필요로하는 것을 성취 할 수있는 다른 가능성이있을 것입니다 ... – derape
예, 당신은 정확하게 이해했습니다. 내가 호기심이기 때문에 나는 그것을 쓰고있다. 처음에 나는 내 자신의 간단한 serializer를 만들고 싶었다. 이제 사용자 정의 복합 유형을 직렬화하고 재귀 적 순회를 추가하려고하지만 어떻게해야하는지 모르겠습니다. – Vlad