2

我正在尝试移动现有代码以使用 ProtoBuf-Net。有些类有 DataContract 但 DataMembers 没有顺序,这会导致忽略这些属性而不是序列化它们。

有没有办法告诉 ProtoBuf-Net 仅序列化标有 [ProtoContract] 的类,并在尝试使用 [XmlType] 或 [DataContract] 序列化类时抛出异常?如果可能,是否会使用 GPB 正确序列化其他系统类(例如 System.String)?

谢谢。

4

1 回答 1

2

公平的问题;这不是以前出现过的场景,但它是一个足够公平的场景,并且很容易解决,谢天谢地......我在 r567 中添加AutoAddProtoContractTypesOnly了。RuntimeTypeModel如果您使用的是 v1 风格的Serializer.Serialize(...)方法,那么您可以通过以下方式应用它:

RuntimeTypeModel.Default.AutoAddProtoContractTypesOnly = true;

(所有Serializer.*方法都映射到RuntimeTypeModel.Default模型实例)

这是我现在通过的测试:

[Test]
public void ExecuteWithoutAutoAddProtoContractTypesOnlyShouldWork()
{
    var model = TypeModel.Create();
    Assert.IsInstanceOfType(typeof(Foo), model.DeepClone(new Foo()));
}
[Test, ExpectedException(typeof(InvalidOperationException),
    ExpectedMessage = "Type is not expected, and no contract can be inferred: Examples.Issues.SO11871726+Foo")]
public void ExecuteWithAutoAddProtoContractTypesOnlyShouldFail()
{
    var model = TypeModel.Create();
    model.AutoAddProtoContractTypesOnly = true;
    Assert.IsInstanceOfType(typeof(Foo), model.DeepClone(new Foo()));
}

[DataContract]
public class Foo { }
于 2012-08-08T20:37:19.630 回答