【问题标题】:protobuf-net build v2.0.0.580 not able to serialize System.Xml.Linq.XElementprotobuf-net build v2.0.0.580 无法序列化 System.Xml.Linq.XElement
【发布时间】:2012-09-28 09:14:25
【问题描述】:

我刚刚用最新版本(版本 2.0.0.580)替换了我在代码库(版本 2.0.0.480)中使用的以前的 protobuf-net 版本 - 因为没有针对 .Net 4.0 或 .Net 的特定版本4.5 在最新的 protobuf 版本中,我在我的项目中引用了 net30 完整 dll。

当尝试序列化包含 System.Xml.Linq.XElement 的复杂类型时,我从 protobuf 序列化程序中收到 InvalidOperationException - 异常消息指出: “没有为类型定义序列化程序:System.Xml.Linq.XElement”

我假设 XElement 缺少序列化程序与没有 .Net 4.0 构建的事实有关(因为我在我的项目中引用了 System.Xml.Linq.dll 的 v4.0.30319)。

我的项目针对 .NET 4.5 平台 - 在引用 protobuf-net V2.0.0.480 net40 构建时它工作正常。

【问题讨论】:

  • 这与4.0无关;我没有特定于 4.0 的构建的原因是因为它不使用任何特定于 4.0 的类型/方法

标签: protobuf-net


【解决方案1】:

这个看起来与“可解析类型”有关——没有内置处理的东西,但符合某些模式,允许它们被视为string。这在过去引起了一些问题,因此 可选 支持,通过 .AllowParseableTypes:

static void Main()
{
    XElement el = XElement.Parse("<xml />");
    var model = TypeModel.Create(); // store and re-use this; don't use
    model.AllowParseableTypes = true; // a new one each time! (very bad)

    var foo = new Foo { Bar = el };
    var clone = (Foo) model.DeepClone(foo);
    var cloneEl = clone.Bar;
}
[ProtoContract]
class Foo
{
    [ProtoMember(1)]
    public XElement Bar { get; set; }
}

请注意,我必须在这里声明 Foo 的原因是它看起来像“根对象”处理(与处理成员/子对象完全不同)没有检查可解析类型;我将不得不调查为什么不并修复它。我希望以下方法可以工作(目前不行,但可能应该):

static void Main()
{
    XElement el = XElement.Parse("<xml />");
    var model = TypeModel.Create(); // store and re-use this; don't use
    model.AllowParseableTypes = true; // a new one each time! (very bad)

    var cloneEl = (XElement)model.DeepClone(el);
}

【讨论】:

  • 嗨,Marc,非常感谢您的快速响应 - 我决定简单地更改我的业务逻辑:我不是通过我的 WCF 服务传输 XElement,而是在使用 protobuf 之前将 XElement 序列化为字符串- net 序列化引擎 - 在服务器端,我会将字符串解析回 XElement 表示。我相应地更改了 protobuf 合约属性,这是一个非常快速的修复。我早该想到这一点,而不是浪费你宝贵的时间。
  • Marc 现在有任何进一步的进展/其他解决方法吗?我正在尝试将遗留代码库转换为使用 Protobuf-net,并且在接近尾声时(当然)我遇到了一个 XElement 成员,它返回与版本 2.0.0.622 的 OP 相同的异常
  • @Shaun 以上有帮助吗?
  • @Marc - 它肯定会停止抛出异常,但“过去引起的问题”和“(非常糟糕)”cmets 让我有点推迟采用这种方法,特别是因为它适用于整个模型,而不仅仅是那个特定的成员,这就是为什么我问是否还有其他解决方法。但是,我当然会相信你的话,直到经验证明并非如此:)
  • @Shaun “问题”仅适用于无意识意图的应用,适用于不适合的类型;正如您所指出的,“非常糟糕”适用于每次都创建一个新模型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多