WCF用于在客戶端和服務器之間傳輸資料。舊的DTO:
[Serializable]
public class TestClass
{
private string firstProperty;
[XmlAttribute]。
public string FirstProperty
{
get => firstProperty;
set => firstProperty = value;
}
客戶將繼續發送舊版本。 該類需要被擴展成這樣:
[Serializable]
public class TestClass
{
private string firstProperty;
private string secondProperty;
[XmlAttribute]。
public string FirstProperty
{
get => firstProperty;
set => firstProperty = value;
}
[XmlAttribute] 。
public string SecondProperty
{
get => secondProperty;
set => secondProperty = value;
}
序列化:
public static void SerializeDataContract< T>(T obj, string path)
{
var serializer = new DataContractSerializer(typeof(T))。
var settings = new XmlWriterSettings { Indent = true };
using (var writer = XmlWriter.Create(path, settings)
{
serializer.WriteObject(writer, obj)。
}
}
public static T DeserializeDataContract< T>(string path)?
{
var serializer = new DataContractSerializer(typeof(T))。
using (var s = File.OpenRead(path))
{
return (T) serializer.ReadObject(s);
}
服務器和一些客戶端將使用新版本。如果我將舊版本序列化并反序列化為新版本,就會拋出以下錯誤:
服務器和一些客戶端將使用新版本。
System.Runtime.Serialization.SerializationException: 'Error in line 1 position 129. 來自命名空間'http://schemas.datacontract.org/2004/07/DTOs'的'EndElement''TestClass'不被期待。期待元素'secondProperty'。'
這個例外通常是在WCF層拋出的,但我提取了一個最小的可重復的例子。 如果我使用XmlSerializer,錯誤就會消失。但是改變序列化器是不可能的,因為老客戶會繼續使用DataContractSerializer。
因此,由于 XmlSerializer 屬性與 DataContractSerializer 的結合,我很難讓它發揮作用。有什么建議嗎?
uj5u.com熱心網友回復:
你可以通過用
[OptionalFieldAttribute]標記來表明secondProperty是可選的:[Serializable] public class TestClass { private string firstProperty; [OptionalField] private string secondProperty; [XmlAttribute[/span]] public string FirstProperty { get => firstProperty; set => firstProperty = value; } [XmlAttribute] 。 public string SecondProperty { get => secondProperty; set => secondProperty = value; }當一個型別被標記為
[Serializable],但不是資料契約屬性時,資料契約序列化器將以類似于BinaryFormatter的方式序列化該型別實體的公共和私有欄位--不是屬性。 因此,除非用[OptionalField]標記,否則所有欄位都必須存在。更多內容請參見資料合約序列化器支持的型別和版本容忍的序列化。容忍缺失的資料。
。注釋:
要將自動實作的屬性的支持欄位標記為可選,請參見NetDataContractSerializer Deserialization With New Property.
。
盡管如此,我不建議將自動屬性與
[Serializable]型別一起使用,因為序列化流將包含秘密支持欄位的名稱。 請參閱.NET WebAPI 序列化 k_BackingField Nastiness了解詳情。你已經用
[XmlAttribute]標記了你的型別,但是這個屬性被DataContractSerializer所忽略。 它只影響XmlSerializer的序列化。示例 fiddle here.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316159.html
標籤:
上一篇:為WCF訊息設定HTML內容型別
