ActiveRecord 객체를 우아하게 직렬화하는 방법에 대한 정보를 찾는 데 어려움을 겪고 있습니다.C# Castle ActiveRecord : 우아하게 (XML) ActiveRecord 객체를 직렬화하는 방법?
우리는 다른 프로그램이이를 해석 할 수있는 방식으로 객체를 출력해야하므로 XML을 형식으로 사용하고자합니다.
XML 직렬화는 일반적으로 매우 쉽고 구현하기 쉽지만 ActiveRecord 데이터베이스에서 반환 된 객체를 직렬화하려고하면 문제가 발생합니다. 데이터베이스는 객체의 프록시 클래스를 반환합니다. 객체의 유형은 [XmlInclude]
속성을 통해 명시 적으로 예상 할 수 없습니다. 예를 들어
:
public class Foo : ActiveRecordLinqBase<Foo>
{
public virtual string Bar{get;set;}
public virtual int FooId{get;set;}
public Foo(string bar)
{
Bar = bar;
}
public static void FooSerializeExample()
{
Foo tehFoozor = new Foo("omgFoo!");
tehFoozor.SaveAndFlush();
int id = tehFoozor.FooId;
//...
//Assume new ActiveRecord session.
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
Foo tehFoozorToSerialize = Foo.Find(id);
using(Stream stream = File.OpenWrite("tehFoozor.xml"))
{
serializer.Serialize(stream, tehFoozorToSerialize); //Will fail
}
}
}
여기 직렬화 할 때, 우리는 메시지를 얻을 것이다 :.
는 "FooProxy2e2de24df9be42909d13a67fdb00b981 예상하지 않은 유형은 정적으로 알 수없는 유형을 지정합니다 XmlInclude 또는 SoapInclude 속성을 사용합니다. "
프록시 유형은 완전히 예측할 수 없습니다 (적어도 내 지식에 따라).
우리 팀은 일시적인 해결책으로 각 AR 개체의 속성을 인터페이스에 스텁 아웃했습니다. 그런 다음 각 객체에 대해 Xml-Serializable 비 AR 버전 인 "컨테이너"객체를 구현했습니다. 우리가 현재 직렬화 된 18 개의 다른 AR 객체를 가지고 있다는 사실을 고려하면, 우리의 솔루션에 36 개의 추가 파일이 있습니다! 무언가 (모든 것)는 이것이 나쁜 해결책이라고 말하지만, 나는 더 나은 방법을 찾을 수 없었습니다.
또한 비누 포맷터를 사용해 보았지만 ActiveRecrodLinqBase <>은 "직렬화 가능으로 표시되어 있지 않습니다"이후로 역시 막 다른 골목이었습니다.
더 많은 검색을 한 후에, 나는 이것이 "지연로드"를 사용하고 있기 때문에 발생하는 이유를 발견했습니다. 로드하는 객체에는 Microsoft MVC를 통해로드되고 표시 될 수있는 수천 개의 파트가 포함되는 심층적 인 계층 구조가 있기 때문에 절충안이 아닙니다. 고위 개발자 중 한 명은 가능한 해결 방법으로 반영되도록 대기하고 있습니다.다른 누구도이 일을 겪어 본 적이 있습니까? – Anj