Способ, которым я справлялся с подобными проблемами в прошлом, заключался в создании «теневого» класса, которым вы управляете, сериализуемого и содержащего части этого класса, которые вы хотите предоставить.
Тогда у вас будет два свойства в вашем классе, одно строго для сериализации и одно для внутреннего использования.
Например, предположим, что сторонний класс выглядит так:
public class ThirdPartyClass
{
public int Property1 { get; set; }
public string Property2 { get; set; }
}
Вы можете создать такую сериализуемую версию (при условии, что вы используете DataContracts):
[DataContract()]
public class ThirdPartyClassSerializable
{
private ThirdPartyClass m_TPC = new ThirdPartyClass();
public ThirdPartyClassSerializable();
public ThirdPartyClassSerializable(ThirdPartyClass oTPC)
{
m_TPC = oTPC;
}
public ThirdPartyClass GetThirdPartyClass()
{
return m_TPC;
}
[DataMember()]
public int Property1
{
get
{
return m_TPC.Property1;
}
set
{
m_TPC.Property1 = value;
}
}
[DataMember()]
public string Property2
{
get
{
return m_TPC.Property2;
}
set
{
m_TPC.Property2 = value;
}
}
}
Тогда ваш корневой сериализуемый класс будет выглядеть так:
[DataContract()]
public class MyClass
{
private ThirdPartyClass m_ThirdPartyClass;
public ThirdPartyClass ThirdPartyClass
{
get
{
return m_ThirdPartyClass;
}
set
{
m_ThirdPartyClass = value;
}
}
[DataMember()]
public ThirdPartyClassSerializable ThirdPartyClassSerialized
{
get
{
return new ThirdPartyClassSerializable(this.ThirdPartyClassNonSerialized);
}
set
{
this.ThirdPartyClass = value.GetThirdPartyClass();
}
}
}
При таком подходе данные сериализуются для внешних вызывающих объектов, как и ожидалось, а исходный класс всегда доступен для внутренних вызывающих объектов.
Вторым преимуществом этого является то, что вы можете предоставлять столько стороннего класса, сколько вам нужно или нужно.
person
competent_tech
schedule
05.11.2013