我一直在使用Protobuf-net作爲使用服務堆棧通過HTTP進行通信的胖客戶端應用程序的序列化程序。我們擁有大量音量的第一位客戶在反序列化時開始出現錯誤。我們在某些模型中發送了DateTimeOffset類型,因此我們創建了一個將值作爲字符串序列化的代理。從我們的日誌中,我可以看到何時發生錯誤,這是它試圖反序列化的日期值在時區偏移重複的末尾有一個額外的六個字符:Protobuf.net和序列化的DateTimeOffset
2016/8/9 12:02:37 AM -7:00 -7:00
這是我們代理的代碼。
[ProtoContract]
public class DateTimeOffsetSurrogate
{
[ProtoMember(1)]
public string DateTimeString { get; set; }
public static implicit operator DateTimeOffsetSurrogate(DateTimeOffset value)
{
return new DateTimeOffsetSurrogate { DateTimeString = value.ToString() };
}
public static implicit operator DateTimeOffset(DateTimeOffsetSurrogate value)
{
try
{
return DateTimeOffset.Parse(value.DateTimeString);
}
catch (Exception ex)
{
throw new Exception("Unable to parse date time value: " + value.DateTimeString, ex);
}
}
}
一旦發生此日期錯誤,它將不會正確序列化/反序列化,直到PC重新啓動。我們無法以一種可以調試和查看剩餘消息的方式重現此錯誤。這是有人熟悉的情況嗎?我們使用的版本是2.0.0.640,由於這個問題,我更新到2.0.0.668,但問題依然存在。
['DateTimeOffset.ToString()'](https://msdn.microsoft.com/en-us/library/bb360056(v = vs.110).aspx)使用**當前文化**,它可以機器不同。即在英國生成的協議緩衝區可能無法被美國的服務器解析。對於序列化,你應該使用不變的文化:['value.ToString(CultureInfo.InvariantCulture)'](https://msdn.microsoft.com/en-us/library/bb335841(v = vs.110).aspx)。並使用[等效方法](https://msdn.microsoft.com/en-us/library/bb356584(v = vs.110).aspx)進行解析。 – dbc
當然,當前的文化設置可以由最終用戶更改。例如,請參閱[這裏](https://stackoverflow.com/questions/25251224/c-sharp-cultureinfo-currentculture-says-en-us-but-my-windows-settings-are-set-to)。 – dbc
另請參閱[如何:往返日期和時間值:往返DateTimeOffset值](https://msdn.microsoft.com/zh-cn/library/bb882584(v = vs.110).aspx )。 – dbc