2017-09-05 53 views
0

使用如下代碼:」沒有開始交換。「錯誤的序列化EdiMessage

... 
EdiMessage ediMessage = (EdiMessage)instance; 
using (FileStream ediStream = File.OpenWrite(file)) 
{ 
    using (EdifactWriter writer = new EdifactWriter(ediStream)) 
    { 
     writer.Write(ediMessage); 
    } 
} 

我收到錯誤消息「沒有交換開始。」

堆棧跟蹤writer.Write調用下面(最後一次公開版Edifabric的):

at EdiFabric.Framework.Writers.EdiWriter`2.Write(EdiMessage message) 

它涉及與BGM,一些FTX和UNH一個D96A INVOIC對象。對象類是。 EdiWriter在電話writer.Write上提出異常。

ediMessage內容似乎有效。據Edifabric documentation它會自動添加默認EDIFACT分隔符:

如果沒有明確指定筆者將使用每個標準默認的分隔符:

我忘記什麼設置?

+0

消息 '無交換開始'。意味着沒有創建交換頭段。 EDI文件採用如下結構:互換標題 - >羣組標題(EDIFACT可選) - >交易 - >羣組預告 - >交換預告。在你的情況下,你需要先寫一個UNB然後寫所有的transactions \ messages。 –

+0

@DonZoeggerle謝謝你的背景;錯誤中的「交換」一詞是由於缺乏EDIFACT術語,當時我不清楚。有了一些額外的灰色單元格,我現在知道它指的是EDI消息交換。 EDIFACT效果很好;簡單,優雅的設計! –

回答

0

這似乎是一個文檔錯誤;違約不會發生。將代碼更改爲:

using (EdifactWriter writer = new EdifactWriter(ediStream)) 
{ 
    var unb = new UNB(); // Begin interchange. 
    writer.Write(unb, Separators.Edifact); 

    writer.Write(ediMessage); 
} 

unb在文檔中插入一個標頭,在此之後添加一條消息。該代碼現在提出了「對象引用未設置爲對象的實例」。與固定通過將調用堆棧

at EdiFabric.Core.Model.Edi.EdiMessage.GetControlNumber(String tag, Int32 position) 

ediMessage.ControlNumber = ...; 
+0

是的,所有級別的控制號碼都是強制性的。不要忘記在寫信之前驗證你的信息。 –

+0

@DonZoeggerle謝謝你的提示。我會看看如何驗證它。我們現在只檢查錯誤。 –