Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用了DataMember属性的属性中抛出异常的良好实践是否正确?_C#_.net_Datacontractserializer_Datacontract_Xml Deserialization - Fatal编程技术网

C# 在应用了DataMember属性的属性中抛出异常的良好实践是否正确?

C# 在应用了DataMember属性的属性中抛出异常的良好实践是否正确?,c#,.net,datacontractserializer,datacontract,xml-deserialization,C#,.net,Datacontractserializer,Datacontract,Xml Deserialization,DataContract和DataMember属性也可用于通过使用DataContract序列化器将对象序列化到文件和进行反序列化。假设我们有一个具有以下私有字段和公共属性的类 public class MyClass { private int positiveValue; public int PositiveValue { get { return positiveValue; } set {

DataContract
DataMember
属性也可用于通过使用
DataContract序列化器将对象序列化到文件和进行反序列化。假设我们有一个具有以下私有字段和公共属性的类

public class MyClass
{
    private int positiveValue;

    public int PositiveValue
    {
        get { return positiveValue; }
        set
        {
            if (value < 1)
                throw new ArgumentOutOfBoundException(...);
            positiveValue = value;
        }
    }
}
公共类MyClass
{
私有int正价值;
公共整数正值
{
获取{return positiveValue;}
设置
{
如果(值<1)
抛出新ArgumentOutOfBoundException(…);
正值=值;
}
}
}
现在,假设我们有一个包含先前序列化对象状态的XML文件,并假设用户修改了该文件,为
PositiveValue
属性指定了一个不正确的值(即非正值)。反序列化期间将引发异常,因为文件中的值无效


假设我们要反序列化文件中的
MyClass
对象列表:如果某个对象无效,则引发异常。是否可以确保
DataContractSerializer
忽略无效对象?此外,考虑到刚才解释的问题,在应用了DataMember属性的属性中抛出异常是一种好做法吗?

在列表中,不能让DC忽略无效对象。如果发生异常,则整个反序列化将中止。如果它没有抛出,它将被添加到您的列表中


我会考虑在反序列化之后检查有效性。在某些情况下,您可能只会说“忽略列表中的无效项”,但坦率地说,在大多数情况下,如果有任何问题,您只想拒绝整个内容。

如果您想在设置属性时验证数据,但想在反序列化过程中绕过这些验证,您可以使用
DataMemberAttribute
而不是属性来标记属性的支持字段。这将导致
DataContractSerializer
直接在字段(而不是属性)中设置值,并且不会引发任何验证异常

[DataMember]
private int positiveValue;

public int PositiveValue
{
    get { return positiveValue; }
    set
    {
        if (value < 1)
            throw new ArgumentOutOfBoundException(...);
        positiveValue = value;
    }
}
[DataMember]
私有int正价值;
公共整数正值
{
获取{return positiveValue;}
设置
{
如果(值<1)
抛出新ArgumentOutOfBoundException(…);
正值=值;
}
}
请注意,支持字段可以是私有的(否则,属性就没有多大意义)。这适用于
DataContractSerializer

此外,考虑到刚才解释的问题,在应用了DataMember属性的属性中抛出异常是否是一种良好的做法


这取决于是否允许在应用程序中包含包含无效数据的对象。不允许设置无效数据的优点是,您不必每次使用对象时都检查它,但在这种情况下,您必须检查任何用户输入,并在加载数据时为异常做好准备。然而,我不认为在数据成员属性中抛出异常是错误的。这只是一个设计决策的问题。

我所做的是加载坏数据,然后用逻辑标记它,以便用户可以修复它。以及不处理坏数据的逻辑。加载文件将包含错误数据。如果用户插入了我不想要的XML,那么返回到XML,因为他们可能会插入到甚至不是有效的XML。