我正在尝试移动现有代码以使用 ProtoBuf-Net。有些类有 DataContract 但 DataMembers 没有顺序,这会导致忽略这些属性而不是序列化它们。
有没有办法告诉 ProtoBuf-Net 仅序列化标有 [ProtoContract] 的类,并在尝试使用 [XmlType] 或 [DataContract] 序列化类时抛出异常?如果可能,是否会使用 GPB 正确序列化其他系统类(例如 System.String)?
谢谢。
我正在尝试移动现有代码以使用 ProtoBuf-Net。有些类有 DataContract 但 DataMembers 没有顺序,这会导致忽略这些属性而不是序列化它们。
有没有办法告诉 ProtoBuf-Net 仅序列化标有 [ProtoContract] 的类,并在尝试使用 [XmlType] 或 [DataContract] 序列化类时抛出异常?如果可能,是否会使用 GPB 正确序列化其他系统类(例如 System.String)?
谢谢。
公平的问题;这不是以前出现过的场景,但它是一个足够公平的场景,并且很容易解决,谢天谢地......我在 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 { }