У меня есть класс в отдельной сборке, который предоставляется через службу WCF.На него ссылаются в моем сервисе.
В этом классе есть несколько структур и один делегат, и я не могу понять, как обеспечить их сериализацию.Когда я закомментирую структуры в классе, объект сериализуется, в противном случае я получаю ошибки.
Я украсил структуры с помощью [Serializable], но это не работает.Вот пример одного из них:
[Serializable]
public delegate bool ValidationDelegateInt( pdInt structure );
[Serializable]
public struct pdInt
{
public pdInt(int i, bool b, int rh, int rl, bool mv, bool va, ValidationDelegateInt v)
{
Value = i;
IsRequired = b;
RangeHigh = rh;
RangeLow = rl;
MustValidate = mv;
IsValidated = va;
Validate = v;
}
public int Value;
public bool IsRequired;
public int RangeHigh;
public int RangeLow;
public bool MustValidate;
public bool IsValidated;
public ValidationDelegateInt Validate;
}
Вот фрагмент, демонстрирующий, как я их объявляю:
[Serializable]
public class PDUser : Person, IValidate
{
#region Members
public pdInt SomeRange;
public pdString SomeString;
Вот код, который иллюстрирует, как я хочу использоватьих на клиенте.
private void bPDUserSelfDL_Click( object sender, EventArgs e )
{
Model.PDUser p = new Model.PDUser();
p.Self( 4 );
p.SomeRange.Value = 1;
if ( p.SomeRange.MustValidate )
{
bool IsValid = p.SomeRange.Validate( p.SomeRange );
}
}
Вот контракт данных:
[DataContract( Name = "PDUserSelfResultSet", Namespace = "V_1" )]
public class PDUserSelfResultSet
{
List<PDUser> m_PDUsers;
[DataMember]
public List<PDUser> PDUsers
{
get
{
return m_PDUsers;
}
set
{
m_PDUsers = value;
}
}
}
и в моем сервисе, вот как я его использую:
public PDUserSelfResultSet PDUserSelf( int PersonID )
{
try
{
PDUserSelfResultSet s = new PDUserSelfResultSet();
s.PDUsers = new List<PDUser>();
PDUser p = new PDUser();
s.PDUsers.Add( p.Self( PersonID ));
return s;
}
catch ( System.Net.WebException we )
{
string s = we.Message;
throw we;
}
catch ( FaultException fe )
{
string s = fe.Message;
throw fe;
}
catch ( Exception e )
{
string s = e.Message;
throw e;
}
}
И на клиенте, наконец, вот как я это называю:
private void Testing()
{
WCFHostServiceClient proxy = new WCFHostServiceClient();
try
{
PDUserSelfResultSet r = new PDUserSelfResultSet();
r = proxy.PDUserSelf( 4 );
List<PDUser> p = r.PDUsers.ToList<PDUser>();
proxy.Close();
}
catch ( System.Net.WebException we )
{
string s = we.Message;
}
catch ( System.ServiceModel.CommunicationException ce )
{
string s = ce.Message;
}
}
Если я закомментирую структуры в моем классе PDUser, то в моем методе Testing () вызов завершится успешно.Если я оставлю структуры в, я получу CommunicationException, что в данном случае означает, что WCF не знает, как обращаться со структурой.
Кто-нибудь знает, как создать контракт данных, чтобы яможно использовать структуры?